2013-10-09 11 views
21

Grundsätzlich, um dies schnell und einfach zu machen, suche ich eine XOR-Bedingung in Django-Vorlage ausführen. Bevor Sie fragen, warum ich es nicht einfach im Code mache, ist dies keine Option.django Vorlage if oder Anweisung

Grundsätzlich muss ich überprüfen, ob ein Benutzer in einem von zwei vielen-zu-vielen Objekten ist.

req.accepted.all 

und

req.declined.all 

Jetzt können sie nur in der einen oder anderen sein (daher der XOR-bedingt). Von der schaut sich um auf die Dokumentation das einzige, was ich herausfinden kann, ist die folgende

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

Das Problem, das ich hier habe, ist, dass, wenn user.username tatsächlich in req.accepted.all scheint sich dann entweicht es die bedingt, aber wenn es in req.declined.all ist, dann folgt es der Bedingungsklausel.

Fehle ich hier etwas?

Antwort

24

and hat eine höhere Priorität als or, so dass Sie nur die zerlegt Version schreiben:

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

Für Effizienz, with mit den querysets überspringen reevaluating:

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

Interessant, danke für die Tipps zur With-Anweisung, aber aus irgendeinem Grund wird diese Bedingung keine else-Anweisung akzeptieren. fragt nach {% endwith%} –

+0

Sie verschachteln sie richtig, richtig? Es muss '{% mit%} {% if%} {% else%} {% endif%} {% endwith%}' sein. –

+0

Ich habe meine Frage oben mit dem Codeabschnitt bearbeitet. –

2

umformuliert Antwort vom akzeptiert eins:

Zu erhalten:

{% if A xor B %}

Do:

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

Es funktioniert!