Bisakah kita menambahkan ke {% block%} daripada menimpa?

116

Di core.html saya, saya memiliki blok berlabel javascript. Akan sangat bagus jika saya dapat menambahkan lebih banyak baris ke blok ini tanpa menimpa semua yang ada di dalamnya.

PKKid
sumber

Jawaban:

9

Menggunakan block.superberfungsi dengan baik saat memperluas template tetapi tidak juga saat menyertakannya, yaitu:

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

Katakanlah Anda ingin memasukkan template di tengah halaman dan Anda juga ingin menambahkan beberapa javascript di blok di akhir halaman: memanggil block.supertemplate yang disertakan akan macet.

Cf. Django mengeluarkan # 7324 , # 12008 , # 13399 dan pemutakhiran terkait ke dokumentasi . Cf. sertakan catatan tag :

Tag include harus dianggap sebagai implementasi dari "render subtemplate ini dan sertakan HTML", bukan sebagai "parse subtemplate ini dan sertakan isinya seolah-olah itu adalah bagian dari induk". Artinya, tidak ada status bersama antara template yang disertakan - setiap penyertaan adalah proses rendering yang sepenuhnya independen.

Blok dievaluasi sebelum dimasukkan. Ini berarti bahwa templat yang menyertakan blok dari yang lain akan berisi blok yang telah dievaluasi dan dirender - bukan blok yang dapat diganti oleh, misalnya, templat yang diperluas.

Dalam hal ini saya akan merekomendasikan penggunaan django-sekizai , yang memungkinkan Anda melakukan hal-hal seperti:

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

Dari django-sekizai README :

Alasan utama saya memulai proyek ini adalah kurangnya kerangka media (css / js) yang baik di django dan django-cms. Ya ada kelas Media yang digunakan dalam formulir di django, tapi sebenarnya itu tidak bekerja dengan baik. Biasanya orang-orang frontend ingin memutuskan file css dan javascript untuk dimasukkan dan mereka tidak ingin mengedit file Python untuk mengubahnya, saya juga tidak ingin mereka mengubah file Python saya. Oleh karena itu ada kebutuhan untuk memungkinkan Anda mengedit konten template yang ada sebelum atau sesudah titik di mana Anda berada sekarang. Juga saya ingin duplikat dihapus. Hasilnya saya menulis django-sekizai, yang persis seperti itu. Ini mirip dengan blok, alih-alih mewarisinya, Anda memperpanjangnya.

Maxime R.
sumber