web-dev-qa-db-ja.com

Django {%with%}タグ内の{%if%} {%else%}タグ?

だから私は次のようなことをしたい:

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

しかしDjangoは別の{%endwith%}タグが必要であることを教えてくれます。この作業を行うためにwithsを再配置する方法はありますか。ものの?

たぶん私はこれについて間違った方法で行っています。このようなことに関して、ある種のベストプラクティスはありますか?

38
Kelly Nicholes

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ステートメントを変更するよりもはるかに多くのDRYです。

59
Ted

このような:

{% 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}}を使用します。

9
Gabriel Ross