{%if%} {%else%}标记内的Django {%with%}标记?

时间:2011-08-16 14:28:22

标签: django templates with-statement if-statement

所以我想做以下事情:

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

但是Django告诉我我需要另一个{%endwith%}标签。有没有什么办法可以重新排列withs来使这个工作,或者语法分析器是否有目的地无忧无虑?

也许我会以错误的方式解决这个问题。在涉及到这样的事情时,是否有某种最佳实践?

2 个答案:

答案 0 :(得分:58)

如果您想保持DRY,请使用包含。

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

或者,更好的是在封装核心逻辑的模型上编写一个方法:

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

然后在模板中:

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

然后将来,如果合法负责人的逻辑变化,你就有一个地方可以改变逻辑 - 远比在十几个模板中改变if语句要干得多。

答案 1 :(得分:9)

像这样:

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

如果html太大而你不想重复它,那么逻辑最好放在视图中。您设置此变量并将其传递给模板的上下文:

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

然后只需在模板中使用{{p}}。