Подтвердить что ты не робот

Теги Django {% with%} в тегах {% if%} {% else%}?

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

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

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

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

4b9b3361

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