2013-10-09 15 views
21

Fondamentalmente per rendere questo rapido e semplice, sto cercando di eseguire un condizionale XOR in template django. Prima di chiedere perché non lo faccio semplicemente nel codice, questa non è un'opzione.django template if or statement

Fondamentalmente è necessario verificare se un utente si trova in uno dei due oggetti molti-a-molti.

req.accepted.all 

e

req.declined.all 

ora possono essere solo in una o l'altra (da qui il XOR condizionale). Dal guardando in giro sui documenti l'unica cosa che riesco a capire è la seguente

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

Il problema che sto avendo è che se user.username effettivamente appaiono in req.accepted.all allora sfugge al condizionale ma se è in req.declined.all allora seguirà la clausola condizionale.

mi manca qualcosa qui?

risposta

24

and ha precedenza maggiore rispetto or, in modo da poter solo scrivere la versione scomposta:

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

Per l'efficienza, utilizzando with di saltare rivalutare le 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

Interessante, grazie per i suggerimenti sull'istruzione with, tuttavia per qualche motivo questo condizionale non accetterà un'altra istruzione al suo interno. continua a chiedere {% endwith%} –

+0

Stai annidandoli correttamente, giusto? Deve essere '{% con%} {% se%} {% else%} {% endif%} {% endwith%}'. –

+0

Ho modificato la mia domanda sopra con la sezione di codice. –

2

risposta riformulato dalla accettata uno:

Per ottenere:

{% if A xor B %}

Do:

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

Funziona!