所以我想做以下事情:
{% if age > 18 %}
{% with patient as p %}
{% else %}
{% with patient.parent as p %}
...
{% endwith %}
{% endif %}
但是Django告诉我我需要另一个{%endwith%}标签。有没有什么办法可以重新排列withs来使这个工作,或者语法分析器是否有目的地无忧无虑?
也许我会以错误的方式解决这个问题。在涉及到这样的事情时,是否有某种最佳实践?
答案 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}}。