2010-10-21 35 views
11

Để minh họa cho câu hỏi của tôi rõ ràng hơn, chúng ta hãy giả sử tôi có một mẫu include.html với nội dung:Mẫu Django: Tại sao khối trong mẫu được bao gồm không thể được ghi đè bởi mẫu con?

{% block test_block %}This is include{% endblock %} 

Tôi có một mẫu gọi là parent.html với nội dung như thế này:

This is parent 

{% include "include.html" %} 

Bây giờ tôi tạo một template được gọi là child.html mở rộng parent.html:

{% extends "parent.html" %} 
{% block test_block %}This is child{% endblock %} 

Ý tưởng của tôi là khi rendering child.html, test_block in ch ild.html có thể ghi đè lên một trong include.html. Theo hiểu biết của tôi, khi một mẫu được bao gồm, nó được bao gồm như nó được. Vì vậy, trong trường hợp của tôi, tôi nghĩ parent.html bằng:

This is parent 

{% block test_block %}This is include{% endblock %} 

Vì vậy child.html sẽ có thể ghi đè test_block. Nhưng có vẻ như nó không thể. Tại sao? Có cách giải quyết nào không?

Trả lời

13

Khi bạn đưa mẫu vào, mẫu sẽ hiển thị mẫu, sau đó bao gồm nội dung được hiển thị.

Từ các tài liệu django:

Các bao gồm thẻ nên được coi là một thực hiện "render subtemplate này và bao gồm HTML", chứ không phải là "phân tích subtemplate này và bao gồm nội dung của nó như thể nó là một phần của cha mẹ ". Điều này có nghĩa là không có trạng thái chia sẻ giữa các mẫu được bao gồm - mỗi mẫu bao gồm là một quá trình kết xuất hoàn toàn độc lập.

Cách giải quyết là để mẫu con mở rộng mẫu bao gồm thay vì mẫu bao gồm. Sau đó, bao gồm mẫu con.

Các vấn đề liên quan