web-dev-qa-db-fra.com

Django {% avec%} balises dans {% if%} {% else%} balises?

Je veux donc faire quelque chose comme suit:

{% if age > 18 %}
    {% with patient as p %}
{% else %}
    {% with patient.parent as p %}
    ...
{% endwith %}
{% endif %}

Mais Django me dit que j'ai besoin d'une autre balise {% endwith%}. Existe-t-il un moyen de réorganiser le withs pour que cela fonctionne, ou est-ce que l'analyseur syntaxique est délibérément insouciant en ce qui concerne ce type de chose?

Peut-être que j'y vais mal. Existe-t-il une sorte de meilleure pratique en ce qui concerne quelque chose comme ça?

38
Kelly Nicholes

si vous voulez rester SEC, utilisez un include.

{% if foo %}
  {% with a as b %}
    {% include "snipet.html" %}
  {% endwith %} 
{% else %}
  {% with bar as b %}
    {% include "snipet.html" %}
  {% endwith %} 
{% endif %}

ou encore mieux serait d'écrire une méthode sur le modèle qui encapsule la logique de base:

def Patient(models.Model):
    ....
    def get_legally_responsible_party(self):
       if self.age > 18:
          return self
       else:
          return self.parent

Puis dans le modèle:

{% with patient.get_legally_responsible_party as p %}
  Do html stuff
{% endwith %} 

Ensuite, à l'avenir, si la logique pour qui est légalement responsable change, vous avez un seul endroit pour changer la logique - bien plus DRY que d'avoir à changer les instructions if dans une douzaine de modèles.

59
Ted

Comme ça:

{% if age > 18 %}
    {% with patient as p %}
    <my html here>
    {% endwith %}
{% else %}
    {% with patient.parent as p %}
    <my html here>
    {% endwith %}
{% endif %}

Si le html est trop grand et que vous ne voulez pas le répéter, alors la logique serait mieux placée dans la vue. Vous définissez cette variable et la transmettez au contexte du modèle:

p = (age > 18 && patient) or patient.parent

puis utilisez simplement {{p}} dans le modèle.

9
Gabriel Ross