2013-07-25 86 views
11

我不確定這是否真的很簡單,我只是在文檔中查看它,或者如果這是Django模板系統的限制,但我需要能夠做一點(不是很高級的)Django中的邏輯,我寧願不必重複自己。先進的Django模板邏輯

比方說,我有3個布爾值; A,B和C.

基本上,我需要做的事:

{% if A and (B or C) %} 
    {{ do stuff }} 
{% endif %} 

但是Django的似乎並沒有讓分組的(B or C)邏輯用括號。有沒有辦法在Django的模板語言中進行這種分組?或做我需要做的是未乾版,這將是:

{% if A and B %} 
     {{ do stuff }} 
    {% else %} 
     {% if A and C %} 
      {{ do the same stuff }} 
     {% endif %} 
    {% endif %} 

回答

22

docs for the if template tag說:在,如果tag是無效的語法

使用實際的括號。如果您需要它們來指示優先級,則應使用嵌套的if標籤。

這是爲了表達對嵌套的標籤你的邏輯清晰的方法:

{% if A %} 
    {% if B or C %} 
    {{ do stuff }} 
    {% endif %} 
{% endif %} 
+0

啊。我懂了。這比我寫的要乾淨得多,即使它不像使用圓括號那麼簡單,至少它幹得相當幹。謝謝! –

+5

如何添加一個'else'分支而不復制它? –

+2

@JoachimBreitner - 一種方法是否定條件,使用身份'〜(A&B)==〜A | 〜B'和'〜(A | B)==〜A&〜B'。所以'{如果不是A或不是B而不是C%} else分支在這裏{%else%} {{do stuff}} {%endif%}'。這將表達式轉換爲「not」,「和」和「or」運算符的非括號優先級賦予所需邏輯的表達式。 –

7

分配任何括號的變量中。

{% with B or C as D %} 
    {% if A and D %} 
    {{ do stuff }} 
    {% endif %} 
{% endwith %} 

PS:這對新版本無效。

+0

你確定這個工作在1.10? –

+0

@OlegTikhonov不確定。現在不使用Django。不過,我希望只要標籤存在,這個標籤就可以工作。 –

+0

沒有正確的,django模板語言只允許在with語句中使用一個值,沒有任何邏輯 –

1

或者,你可以「擴大」括號中的內容,並評估它:

{% if A and B or A and C %} 
    {{ do stuff }} 
{% endif %}