Chúng tôi có thể thêm vào {% block%} thay vì ghi đè không?


116

Trong core.html của tôi, tôi có một khối được gắn nhãn javascript. Sẽ thật tuyệt nếu tôi có thể nối thêm nhiều dòng vào khối này mà không ghi đè lên mọi thứ trong đó.

Câu trả lời:



9

Việc sử dụng block.superhoạ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.supermẫu được bao gồm sẽ bị lỗi.

Cf Django sự cố # 7324 , # 12008 , # 13399bả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" %}

Từ django-sekizai README :

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.