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?
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.
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.