2011-08-16 44 views
31

所以我想這樣做如下:Django {%with%}標記在{%if%} {%else%}標記中嗎?

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

但Django是告訴我,我需要另一個{%ENDWITH%}標籤。有沒有什麼辦法可以重新安排合作伙伴來完成這項工作,還是有句法分析器有目的地無憂無慮地處理這類事情?

也許我正在以這種錯誤的方式去做。當涉及到這樣的事情時,是否有某種最佳實踐?

回答

47

如果你想保持乾爽,請使用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語句更加乾燥。

+4

你可能是DRYer。使用'{%include'snipet.html'with 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

這就是我所害怕的。我儘量保持乾爽,但如果這是唯一的方法,那麼它是。謝謝! –