django template if or statement

Llanilek picture Llanilek · Oct 10, 2013 · Viewed 60k times · Source

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?

Answer

Peter DeGlopper picture Peter DeGlopper · Oct 10, 2013

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