Câu trả lời:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
Việc sử dụng block.super
hoạt động tốt khi mở rộng một mẫu nhưng không tốt khi bao gồm một mẫu, tức là:
{% extends "base.html" %} vs. {% include "partial.html" %}
Giả sử bạn muốn đưa một mẫu vào giữa trang của mình và bạn cũng muốn nó thêm một số javascript vào một khối ở cuối trang: việc gọi block.super
mẫu được bao gồm sẽ bị lỗi.
Cf Django sự cố # 7324 , # 12008 , # 13399 và bản cập nhật liên quan đến tài liệu . Cf bao gồm ghi chú thẻ :
Thẻ include nên được coi là cách triển khai “hiển thị phương thức con này và bao gồm HTML”, chứ không phải là “phân tích cú pháp phương thức con này và bao gồm nội dung của nó như thể nó là một phần của mẫu chính”. Đ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ác khối được đánh giá trước khi chúng được đưa vào. Điều này có nghĩa là một mẫu bao gồm các khối từ một mẫu khác sẽ chứa các khối đã được đánh giá và hiển thị - không phải các khối có thể bị ghi đè bởi ví dụ, một mẫu mở rộng.
Trong trường hợp đó, tôi khuyên bạn nên sử dụng django-sekizai , cho phép bạn làm những việc như:
{% load sekizai_tags %}
⎧ <p>Some content</p>
<p>Some content</p> | {% addtoblock "js" %}
| <script type="text/javascript">
{% include "partial.html" %} -> ⎨ alert("Hello django-sekizai");
| </script>
<p>Some more content</p> ⎩ {% endaddtoblock %}
{% render_block "js" %}
Lý do chính mà tôi bắt đầu dự án này là do thiếu một khung media (css / js) tốt trong django và django-cms. Có, có lớp Phương tiện được sử dụng trong các biểu mẫu trong django, nhưng thực sự điều đó không hoạt động tốt. Thông thường, những người giao diện người dùng muốn quyết định các tệp css và javascript được đưa vào và họ không muốn phải chỉnh sửa các tệp Python để thay đổi điều mà tôi cũng không muốn họ thay đổi các tệp Python của mình. Vì vậy, cần phải cho phép bạn chỉnh sửa nội dung của các mẫu trước hoặc sau thời điểm hiện tại của bạn. Ngoài ra, tôi muốn các bản sao được loại bỏ. Kết quả là tôi đã viết django-sekizai, nó thực hiện chính xác điều đó. Nó tương tự như các khối, chỉ là thay vì kế thừa chúng, bạn mở rộng chúng.