web-dev-qa-db-ja.com

django template ifまたはstatement

基本的にこれを素早く簡単にするために、XOR Djangoテンプレートで実行することを探しています。コードでは、これはオプションではありません。

基本的に、ユーザーが2つの多対多オブジェクトのいずれかに属しているかどうかを確認する必要があります。

req.accepted.all 

そして

req.declined.all

今、それらはどちらか一方にしか入れることができません(したがってXOR条件付き)。ドキュメントを見て回ると、私が理解できる唯一のものは次のとおりです。

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

私がここで抱えている問題は、user.usernameが実際にreq.accepted.allに現れる場合、条件をエスケープするが、req.declined.allにある場合は条件節に従うことです。

ここに何かが足りませんか?

26
Neil Hickman

andorよりも優先度が高いため、分解バージョンを書くことができます。

{% 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 %}
34
Peter DeGlopper

受け入れられたものからの言い換えの言い換え:

取得するため:

{% if A xor B %}

行う:

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

できます!

9
db0