2011-08-16 5 views
31

だから私は、次のような何かをしたい:{%if%} {%else%}タグ内のDjango {%with%}タグはありますか?

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

をしかし、Djangoは、私は別の{%ENDWITHの%}タグが必要であることを私に言っています。この仕事をするために、withsを再編成する方法はありますか、あるいはこの種のことに関して意図的に気にならないシンタックスアナライザーですか?

多分私はこれについて間違った方法をとっています。このようなことについては、何らかのベストプラクティスがありますか?このよう

答えて

47

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

次に将来的には、誰が法的責任を負っているかを判断するロジックが変更されれば、論理を変更する場所が1つしかない。

+4

あなたはDRYerかもしれません。 '{%include" snipet.html "a = b%}"を使ってください(おそらく最近のDjangoのことです)。 – Patrick

+2

'get_legally_responsible_party'は最も乾燥しています。 – benzkji

7

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

+0

これは私が恐れていたものです。私はDRYを維持しようとしますが、これが唯一の方法ならば、そうです。ありがとう! –

関連する問題