Django {% with %} теги внутри тегов {% if %} {% else %}?

Итак, я хочу сделать что-то вроде следующего:

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

Но Django говорит мне, что мне нужен еще один тег {% endwith %}. Есть ли способ переставить with, чтобы это работало, или синтаксический анализатор намеренно беззаботен в отношении такого рода вещей?

Может быть, я иду об этом неправильно. Есть ли какая-то передовая практика, когда дело доходит до чего-то подобного?


person Kelly Nicholes    schedule 16.08.2011    source источник


Ответы (2)


если вы хотите остаться СУХИМ, используйте 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 %} 

Затем в будущем, если логика того, кто несет юридическую ответственность, изменится, у вас будет единственное место для изменения логики — гораздо более СУХОЕ, чем изменение операторов if в дюжине шаблонов.

person Ted    schedule 16.08.2011
comment
Вы могли бы быть DRYer. Используйте {% include "snipet.html" with a=b %} (хотя это, вероятно, недавняя вещь Django) - person Patrick; 11.05.2014
comment
get_legally_responsible_party самый сухой. - person benzkji; 23.06.2015
comment
Как вы сравниваете со строкой? - person srccode; 24.01.2020

Как это:

{% 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 }} в шаблоне.

person Gabriel Ross    schedule 16.08.2011
comment
Вот чего я боялся. Стараюсь держать СУХОЙ, но если это единственный способ, то так тому и быть. Спасибо! - person Kelly Nicholes; 16.08.2011
comment
Как вы сравниваете со строкой? - person srccode; 24.01.2020