2013-10-09 14 views
21

Zasadniczo, aby zrobić to szybko i prosto, szukam uruchomienia warunków warunkowych XOR w szablonie django. Zanim zapytasz, dlaczego nie zrobię tego w kodzie, nie jest to opcja.szablon django if lub statement

Zasadniczo muszę sprawdzić, czy użytkownik jest w jednym z dwóch obiektów typu wiele-do-wielu.

req.accepted.all 

i

req.declined.all 

Teraz mogą być tylko w jednej lub drugiej (stąd XOR warunkowego). Od rozglądać na docs jedyne co mogę dowiedzieć się następująco

{% if user.username in req.accepted.all or req.declined.all %} 

Problem mam jest to, że jeśli user.username rzeczywiście pojawiają się w req.accepted.all potem ucieka warunkowe, ale jeśli jest w req.declined.all, to będzie postępować zgodnie z klauzulą ​​warunkową.

Czy tu czegoś brakuje?

Odpowiedz

24

and ma wyższy priorytet niż or, więc można po prostu napisać rozłożony wersję:

{% if user.username in req.accepted.all and user.username not in req.declined.all or 
     user.username not in req.accepted.all and user.username in req.declined.all %} 

Dla zwiększenia efektywności korzystania with pominąć przewartościowania tych querysets:

{% with accepted=req.accepted.all declined=req.declined.all username=user.username %} 
    {% if username in accepted and username not in declined or 
      username not in accepted and username in declined %} 
    ... 
{% endif %} 
{% endwith %} 
+0

Interesujące, dziękuję za porady na temat instrukcji with, jednak z jakiegoś powodu ta warunkowa nie zaakceptuje w niej instrukcji else. wciąż prosi o {% endwith%} –

+0

Rozgałęziacie je poprawnie, prawda? Musi to być '{% z%} {% jeśli%} {% else%} {% endif%} {% endwith%}'. –

+0

Edytowałem moje pytanie powyżej z sekcją kodu. –

2

rephrased odpowiedź od przyjętych jeden:

Aby uzyskać:

{% if A xor B %}

Do:

{% if A and not B or B and not A %}

To działa!