Теги Django {% with%} в тегах {% if%} {% else%}?
Итак, я хочу сделать что-то вроде следующего:
{% if age > 18 %}
{% with patient as p %}
{% else %}
{% with patient.parent as p %}
...
{% endwith %}
{% endif %}
Но Django говорит мне, что мне нужен еще один тег {% endwith%}. Есть ли способ переупорядочить команды, чтобы сделать эту работу, или синтаксический анализатор целенаправленно относится к этой вещи?
Возможно, я поступил неправильно. Есть ли какая-то лучшая практика, когда дело доходит до чего-то подобного?
Ответы
Ответ 1
если вы хотите остаться сухим, используйте include.
{% 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 %}
Тогда в будущем, если логика для того, кто имеет юридически ответственные изменения, у вас есть одно место для изменения логики - гораздо более DRY, чем необходимость менять, если инструкции в десятке шаблонов.
Ответ 2
Вот так:
{% 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}} в шаблоне.