django template if or statement

Question:

Basically to make this quick and simple, I’m looking to run an XOR conditional in django template. Before you ask why don’t I just do it in the code, this isn’t an option.

Basically I need to check if a user is in one of two many-to-many objects.

req.accepted.all 

and

req.declined.all

Now they can only be in one or the other (hence the XOR conditional). From the looking around on the docs the only thing I can figure out is the following

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

The problem I’m having here is that if user.username does indeed appear in req.accepted.all then it escapes the conditional but if it’s in req.declined.all then it will follow the conditional clause.

Am I missing something here?

Asked By: Llanilek

||

Answers:

and has higher precedence than or, so you can just write the decomposed version:

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

For efficiency, using with to skip reevaluating the 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 %}
Answered By: Peter DeGlopper

Rephrased answer from the accepted one:

To get:

{% if A xor B %}

Do:

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

It works!

Answered By: db0