2013-10-09 17 views
21

Về cơ bản để làm điều này nhanh chóng và đơn giản, tôi đang tìm cách chạy một điều kiện XOR trong mẫu django. Trước khi bạn hỏi tại sao tôi không làm điều đó trong mã, đây không phải là một lựa chọn.mẫu django nếu hoặc tuyên bố

Về cơ bản, tôi cần kiểm tra xem người dùng có thuộc một trong hai đối tượng nhiều người không.

req.accepted.all 

req.declined.all 

Bây giờ họ chỉ có thể ở một hay cách khác (vì thế XOR có điều kiện). Từ nhìn xung quanh trên các tài liệu điều duy nhất tôi có thể hình dung ra là sau

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

Vấn đề tôi đang gặp ở đây là nếu user.username không thực sự xuất hiện trong req.accepted.all sau đó nó thoát khỏi sự có điều kiện nhưng nếu nó nằm trong req.declined.all thì nó sẽ theo mệnh đề có điều kiện.

Tôi có thiếu gì đó ở đây không?

Trả lời

24

and có độ ưu tiên cao hơn or, vì vậy bạn chỉ có thể viết phiên bản bị phân hủy:

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

Đối với hiệu quả, sử dụng with để bỏ qua đánh giá lại queryset:

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

Thú vị, cảm ơn những lời khuyên về tuyên bố với, tuy nhiên vì một lý do nào đó điều kiện này sẽ không chấp nhận một tuyên bố khác trong đó. tiếp tục yêu cầu {% endwith%} –

+0

Bạn đang lồng ghép chúng đúng cách, phải không? Nó phải là '{% với%} {% nếu%} {% else%} {% endif%} {% endwith%}'. –

+0

Tôi đã chỉnh sửa câu hỏi của mình ở trên với phần mã. –

2

rephrased câu trả lời từ chấp nhận một:

Để nhận được:

{% if A xor B %}

Đỗ:

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

Nó hoạt động!