Django {% с тегами%} в тегах {% if%} {% else%}? - PullRequest
37 голосов
/ 16 августа 2011

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

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

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

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

Ответы [ 2 ]

59 голосов
/ 16 августа 2011

, если вы хотите остаться СУХИМ, используйте включение.

{% 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 %} 

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

9 голосов
/ 16 августа 2011

Вот так:

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

...