wake-up-neo.com

Django {% with%} tags innerhalb von {% if%} {% else%} tags?

Also möchte ich so etwas wie folgendes machen:

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

Aber Django sagt mir, dass ich ein weiteres {% endwith%} -Tag benötige. Gibt es eine Möglichkeit, die Withs neu anzuordnen, damit dies funktioniert, oder ist der syntaktische Analysator in Bezug auf diese Art absichtlich unbeschwert? der Sache?

Vielleicht gehe ich das falsch an. Gibt es eine Art von Best Practice, wenn es um so etwas geht?

38
Kelly Nicholes

wenn Sie trocken bleiben möchten, verwenden Sie ein Include.

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

oder noch besser wäre es, eine Methode für das Modell zu schreiben, die die Kernlogik kapselt:

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

Dann in der Vorlage:

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

Wenn sich dann in Zukunft die Logik für die gesetzlich Verantwortlichen ändert, haben Sie nur einen Ort, an dem Sie die Logik ändern können - weitaus mehr DRY, als wenn Sie if-Anweisungen in einem Dutzend Vorlagen ändern müssen.

59
Ted

So was:

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

Wenn der HTML-Code zu groß ist und Sie ihn nicht wiederholen möchten, sollte die Logik besser in der Ansicht platziert werden. Sie legen diese Variable fest und übergeben sie an den Kontext der Vorlage:

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

und dann benutze einfach {{p}} in der Vorlage.

9
Gabriel Ross