2013-07-25 18 views
11

Nie jestem pewien, czy to naprawdę proste, a ja po prostu przejrzałem to w dokumentacji lub jeśli jest to ograniczenie systemu szablonów Django, ale muszę być w stanie zrobić trochę (niezbyt) zaawansowana logika w Django i wolałbym nie powtarzać się od nowa.Zaawansowana logika szablonowa Django

Załóżmy, że mam 3 wartości logiczne; A, B, i C.

I w zasadzie trzeba zrobić:

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

Jednak Django nie wydaje się, aby umożliwić grupowanie logikę (B or C) z nawiasami. Czy istnieje sposób na zrobienie tego rodzaju grupowania w języku szablonów Django? Czy muszę zrobić wersję un-DRY tego, co byłoby:

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

Odpowiedz

22

docs for the if template tag powiedzieć:

użycie rzeczywistych w nawiasach, jeśli znacznik jest nieprawidłowa składnia. Jeśli chcesz, aby wskazywały pierwszeństwo, użyj zagnieżdżonych tagów.

Jest czystszy sposób wyrazić swoją logikę z zagnieżdżonych znaczników:

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

Ah. Widzę. Jest to znacznie czystsze niż to, co napisałem, a nawet jeśli nie jest tak proste, jak używanie nawiasów, to przynajmniej jest ono dość suche. Dzięki! –

+5

Jak dodać gałąź "else" bez jej duplikowania? –

+2

@JoachimBreitner - jednym ze sposobów byłoby zanegowanie warunkowego, używając tożsamości '~ (A i B) == ~ A | ~ B' i '~ (A | B) == ~ A i ~ B'. Tak więc "{% jeśli nie A lub nie B, a nie C%} tu rozgałęziają się {% else%} {{do rzeczy}} {% endif%}'. To konwertuje wyrażenie na takie, w którym nieobjętościowe nawiązywanie priorytetów operatorów "nie", "i" oraz "lub" daje pożądaną logikę. –

7

Przypisz cokolwiek wewnątrz nawiasu do zmiennej.

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

PS: To nie działa w nowszych wersjach.

+0

na pewno to działa w 1.10? –

+0

@OlegTikhonov Nie jestem pewien. W dzisiejszych czasach nie używam Django. Mam jednak nadzieję, że to musi działać tak długo, jak z tagami i jeśli istnieją. –

+0

Nie ma poprawnego języka szablonowego django, który zezwala tylko na jedną wartość w instrukcji with, bez logiki. –

1

Alternatywnie, można 'rozszerzyć' zawartość nawiasu i ocenia ją jako:

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