ใน core.html ของฉันฉันมีบล็อกชื่อ javascript จะดีมากถ้าฉันสามารถต่อท้ายบรรทัดเพิ่มเติมในบล็อกนี้โดยไม่ต้องเขียนทับทุกอย่างในนั้น
ใน core.html ของฉันฉันมีบล็อกชื่อ javascript จะดีมากถ้าฉันสามารถต่อท้ายบรรทัดเพิ่มเติมในบล็อกนี้โดยไม่ต้องเขียนทับทุกอย่างในนั้น
คำตอบ:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
ใช้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" %}
เหตุผลหลักที่ฉันเริ่มโครงการนี้คือขาดกรอบสื่อที่ดี (css / js) ใน django และ django-cms ใช่มีคลาส Media ที่ใช้ในรูปแบบใน django แต่มันใช้งานได้ไม่ดีนัก โดยปกติคนส่วนหน้าต้องการตัดสินใจเกี่ยวกับไฟล์ css และ javascript ที่จะรวมและพวกเขาไม่ต้องการที่จะต้องแก้ไขไฟล์ Python เพื่อเปลี่ยนแปลงซึ่งฉันก็ไม่ต้องการให้พวกเขาเปลี่ยนไฟล์ Python ของฉัน ดังนั้นจึงจำเป็นต้องอนุญาตให้คุณแก้ไขเนื้อหาของเทมเพลตที่อยู่ก่อนหรือหลังจุดที่คุณอยู่ตอนนี้ นอกจากนี้ฉันต้องการให้ลบรายการที่ซ้ำกันออกไป ด้วยเหตุนี้ฉันจึงเขียน django-sekizai ซึ่งทำอย่างนั้น มันคล้ายกับบล็อกเพียง แต่คุณขยายมันออกไปแทนการสืบทอด