57 votes

Django {% with %} tags dans {% if %} {% else %} tags ?

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 les withs pour que cela fonctionne, ou l'analyseur syntaxique est-il volontairement insouciant en ce qui concerne ce genre de chose ?

Peut-être que je m'y prends dans le mauvais sens. Y a-t-il une sorte de meilleure pratique quand il s'agit de quelque chose comme ça?

87voto

Ted Points 1886

si vous voulez rester au 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 - beaucoup plus SEC que d'avoir à changer les instructions if dans une douzaine de modèles.

12voto

Gabriel Ross Points 2906

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 code html est trop gros 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X