2011-08-16 33 views
31

Vì vậy, tôi muốn làm một cái gì đó như sau:Thẻ Django {% với%} trong các thẻ {% if%} {% else%}?

{% if age > 18 %} 
    {% with patient as p %} 
{% else %} 
    {% with patient.parent as p %} 
    ... 
{% endwith %} 
{% endif %} 

Nhưng Django đang nói với tôi rằng tôi cần một {% endwith%} thẻ. Có cách nào để sắp xếp lại các khoản tiền để làm công việc này, hay là máy phân tích cú pháp có mục đích vô tư liên quan đến loại điều này?

Có thể tôi đang nói về điều này một cách sai lầm. Có một số loại thực hành tốt nhất khi nói đến một cái gì đó như thế này?

Trả lời

47

nếu bạn muốn giữ DRY, hãy sử dụng bao gồm.

{% if foo %} 
    {% with a as b %} 
    {% include "snipet.html" %} 
    {% endwith %} 
{% else %} 
    {% with bar as b %} 
    {% include "snipet.html" %} 
    {% endwith %} 
{% endif %} 

hoặc, thậm chí tốt hơn sẽ được để viết một phương pháp trên mô hình mà đóng gói logic lõi:

def Patient(models.Model): 
    .... 
    def get_legally_responsible_party(self): 
     if self.age > 18: 
      return self 
     else: 
      return self.parent 

Sau đó, trong mẫu:

{% with patient.get_legally_responsible_party as p %} 
    Do html stuff 
{% endwith %} 

Sau đó, trong tương lai, nếu logic cho những thay đổi có trách nhiệm về mặt pháp lý, bạn có một nơi duy nhất để thay đổi logic - nhiều DRY hơn là phải thay đổi nếu các câu lệnh trong một tá mẫu.

+4

Bạn có thể DRYer. Sử dụng '{% include" snipet.html "với a = b%}' (mặc dù đây có thể là một điều Django gần đây) – Patrick

+2

'get_legally_responsible_party' là khô nhất. – benzkji

7

Như thế này:

{% if age > 18 %} 
    {% with patient as p %} 
    <my html here> 
    {% endwith %} 
{% else %} 
    {% with patient.parent as p %} 
    <my html here> 
    {% endwith %} 
{% endif %} 

Nếu html là quá lớn và bạn không muốn lặp lại nó, sau đó logic sẽ tốt hơn được đặt trong giao diện. Bạn đặt biến này và chuyển nó vào ngữ cảnh của mẫu:

p = (age > 18 && patient) or patient.parent 

và sau đó chỉ sử dụng {{p}} trong mẫu.

+0

Đó là điều tôi sợ. Tôi cố gắng giữ DRY, nhưng nếu đây là cách duy nhất, thì nó sẽ như vậy. Cảm ơn! –