2013-07-25 88 views
11

Tôi không chắc chắn nếu điều này là thực sự dễ dàng và tôi chỉ liếc qua nó trong tài liệu, hoặc nếu đây là một hạn chế của hệ thống mẫu Django, nhưng tôi cần để có thể làm một chút (không phải là rất) logic tiên tiến ở Django, và tôi không muốn phải lặp lại bản thân mình.Nâng cao Django Mẫu Logic

Giả sử tôi có 3 giá trị boolean; A, B, và C.

tôi về cơ bản cần thực hiện:

{% if A and (B or C) %} 
    {{ do stuff }} 
{% endif %} 

Tuy nhiên Django dường như không cho phép nhóm logic (B or C) với dấu ngoặc đơn. Có cách nào để làm kiểu nhóm đó trong ngôn ngữ mẫu của Django không? Hay tôi cần phải làm những phiên bản un-DRY đó, đó sẽ là:

{% if A and B %} 
     {{ do stuff }} 
    {% else %} 
     {% if A and C %} 
      {{ do the same stuff }} 
     {% endif %} 
    {% endif %} 

Trả lời

22

Các docs for the if template tag nói:

Sử dụng dấu ngoặc đơn thực tế trong nếu thẻ là cú pháp hợp lệ. Nếu bạn cần chúng để cho biết mức độ ưu tiên, bạn nên sử dụng các thẻ lồng nhau nếu.

Đây là một cách sạch hơn để diễn tả logic của bạn với các thẻ lồng nhau:

{% if A %} 
    {% if B or C %} 
    {{ do stuff }} 
    {% endif %} 
{% endif %} 
+0

Ah. Tôi hiểu rồi. Đó là sạch hơn đáng kể so với những gì tôi đã viết, và thậm chí nếu nó không đơn giản như việc có thể sử dụng dấu ngoặc đơn, ít nhất nó khá DRY. Cảm ơn! –

+5

Bạn sẽ thêm chi nhánh 'else' khác như thế nào mà không cần sao chép nó? –

+2

@JoachimBreitner - một cách sẽ là phủ nhận điều kiện, sử dụng danh tính '~ (A & B) == ~ A | ~ B' và '~ (A | B) == ~ A & ~ B'. Vì vậy, '{% nếu không phải là A hoặc không B và không phải C%}, hãy chia nhánh ở đây {% else%} {{do stuff}} {% endif%}'. Điều đó chuyển đổi biểu thức thành một trong đó ưu tiên không được ưu tiên hóa của toán tử 'not',' và' và 'hoặc' cho logic mong muốn. –

7

Gán bất cứ điều gì bên trong dấu ngoặc đơn để một biến.

{% with B or C as D %} 
    {% if A and D %} 
    {{ do stuff }} 
    {% endif %} 
{% endwith %} 

PS: Điều này không hoạt động trên các phiên bản mới hơn.

+0

u chắc chắn this worksin 1.10? –

+0

@OlegTikhonov Không chắc chắn. Không sử dụng Django ngày nay. Tuy nhiên, tôi hy vọng điều này phải làm việc miễn là với và nếu thẻ tồn tại. –

+0

Không chính xác, ngôn ngữ templating django chỉ cho phép một giá trị trong một tuyên bố với, không có logic nào –

1

Ngoài ra, bạn có thể 'mở rộng' các nội dung của ngoặc và đánh giá nó như:

{% if A and B or A and C %} 
    {{ do stuff }} 
{% endif %}