2012-06-08 22 views
5

Tôi đã chạy vào hành vi rất lạ của hệ thống mẫu Django. Tôi có một tập tin mẫu, cụ thể là test.html, mà đệ quy bao gồm bản thân:Thẻ có điều kiện bao gồm trong Django

{% include "test.html" %} 

Tất nhiên, mẫu như vậy không có cơ hội để được trả lại, vì không có điều kiện hoàn thiện. OK, chúng ta hãy thử như sau:

{% if test_false %}{% include "test.html" %}{% endif %}, 

nơi test_false là một biến chuyển cho template và bằng False.

Một hy vọng rằng nó sẽ không bao gồm bất cứ điều gì, nhưng nó:

RuntimeError at /test/ 
maximum recursion depth exceeded while calling a Python object 

Tôi không nhận được nó. Bao gồm thẻ có thể lấy đối số từ ngữ cảnh hiện tại, vì vậy tôi nghi ngờ nó được thực thi trước bất kỳ phần nào khác của trang. Vậy tại sao nó bỏ qua thẻ điều kiện?

Trả lời

6

Django có tối ưu hóa bao gồm các mẫu được cung cấp bởi hằng số khi biên dịch.

Set tên của mẫu để thay đổi và bao gồm nó theo cách đó:

{% include test_template %} 

Django sẽ không thể sử dụng nó tối ưu hóa và mã của bạn nên làm việc.

-1

Giống như Thomasz nói, Django chỉ có thể thực hiện tối ưu hóa này nếu đường dẫn được định nghĩa như là một chuỗi liên tục trong đó có mẫu - như vậy:

{% include "test.html" %} 

Nhưng tôi thà không cần phải đặt đường dẫn mẫu trong ngữ cảnh từ mã Python.

Vì vậy, đây là một cách khép kín hơn một chút để đạt được kết quả tương tự - quấn bao gồm trong một with:

{% with "test.html" as path %} 
    {% include path %} 
{% endwith %}