เราสามารถต่อท้าย {% block%} แทนการเขียนทับได้หรือไม่


116

ใน core.html ของฉันฉันมีบล็อกชื่อ javascript จะดีมากถ้าฉันสามารถต่อท้ายบรรทัดเพิ่มเติมในบล็อกนี้โดยไม่ต้องเขียนทับทุกอย่างในนั้น

คำตอบ:



9

ใช้block.superงานได้ดีเมื่อขยายเทมเพลต แต่ไม่ดีเมื่อรวมหนึ่งเช่น:

{% extends "base.html" %} vs. {% include "partial.html" %}

สมมติว่าคุณต้องการรวมเทมเพลตไว้ตรงกลางเพจของคุณและคุณต้องการให้เพิ่มจาวาสคริปต์ในบล็อกที่ส่วนท้ายของหน้าการโทรblock.superในเทมเพลตที่รวมอยู่จะขัดข้อง

cf เลย ปัญหา Django # 7324 , # 12008 , # 13399และการปรับปรุงที่เกี่ยวข้องกับเอกสาร cf เลย รวมแท็กหมายเหตุ:

แท็กรวมควรถือเป็นการใช้งาน "แสดงเทมเพลตย่อยนี้และรวม HTML" ไม่ใช่ "แยกวิเคราะห์เทมเพลตย่อยนี้และรวมเนื้อหาราวกับว่าเป็นส่วนหนึ่งของพาเรนต์" ซึ่งหมายความว่าไม่มีสถานะที่ใช้ร่วมกันระหว่างเทมเพลตที่รวมอยู่ - แต่ละเทมเพลตเป็นกระบวนการแสดงผลที่เป็นอิสระอย่างสมบูรณ์

บล็อกจะได้รับการประเมินก่อนที่จะรวม ซึ่งหมายความว่าเทมเพลตที่รวมบล็อกจากที่อื่นจะมีบล็อกที่ได้รับการประเมินและแสดงผลแล้วไม่ใช่บล็อกที่สามารถแทนที่ได้โดยตัวอย่างเช่นเทมเพลตแบบขยาย

ในกรณีนี้ฉันขอแนะนำให้ใช้django-sekizaiซึ่งจะอนุญาตให้คุณทำสิ่งต่างๆเช่น:

{% 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" %}

จากdjango-sekizai README :

เหตุผลหลักที่ฉันเริ่มโครงการนี้คือขาดกรอบสื่อที่ดี (css / js) ใน django และ django-cms ใช่มีคลาส Media ที่ใช้ในรูปแบบใน django แต่มันใช้งานได้ไม่ดีนัก โดยปกติคนส่วนหน้าต้องการตัดสินใจเกี่ยวกับไฟล์ css และ javascript ที่จะรวมและพวกเขาไม่ต้องการที่จะต้องแก้ไขไฟล์ Python เพื่อเปลี่ยนแปลงซึ่งฉันก็ไม่ต้องการให้พวกเขาเปลี่ยนไฟล์ Python ของฉัน ดังนั้นจึงจำเป็นต้องอนุญาตให้คุณแก้ไขเนื้อหาของเทมเพลตที่อยู่ก่อนหรือหลังจุดที่คุณอยู่ตอนนี้ นอกจากนี้ฉันต้องการให้ลบรายการที่ซ้ำกันออกไป ด้วยเหตุนี้ฉันจึงเขียน django-sekizai ซึ่งทำอย่างนั้น มันคล้ายกับบล็อกเพียง แต่คุณขยายมันออกไปแทนการสืบทอด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.