шаблон django if или оператор

В основном, чтобы сделать это быстро и просто, я ищу, чтобы запустить условное XOR в шаблоне django. Прежде чем вы спросите, почему бы мне просто не сделать это в коде, это не вариант.

В основном мне нужно проверить, находится ли пользователь в одном из двух объектов "многие ко многим".

req.accepted.all 

и

req.declined.all

Теперь они могут быть только в одном или другом (отсюда условие XOR). Из-за осмотра документов единственное, что я могу понять, это после

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

проблема, с которой я здесь, заключается в том, что если пользователь.имя пользователя действительно появляется в req.общепринятый.все тогда он избегает условного, но если он находится в req.отклонить.все тогда будет следовать условному предложению.

Я что-то пропустил?

2 ответов


and имеет более высокий приоритет, чем or, поэтому вы можете просто написать разложенную версию:

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

для эффективности, используя with чтобы пропустить переоценку запросов:

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

перефразированный ответ из принятого:

для:

{% if A xor B %}

Do:

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

это работает!