Possiamo aggiungere a un {% block%} invece di sovrascriverlo?


116

Nel mio core.html ho un blocco denominato javascript. Sarebbe fantastico se potessi aggiungere più righe a questo blocco senza sovrascrivere tutto ciò che contiene.

Risposte:



9

L'uso block.superfunziona bene quando si estende un modello ma non altrettanto quando si include uno, ad esempio:

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

Supponiamo che tu voglia includere un modello al centro della tua pagina e che desideri anche aggiungere un po 'di javascript in un blocco alla fine della pagina: la chiamata block.supernel modello incluso andrà in crash.

Cf. I numeri di Django # 7324 , # 12008 , # 13399 e il relativo aggiornamento alla documentazione . Cf. includi la nota del tag :

Il tag include dovrebbe essere considerato come un'implementazione di "visualizza questo subtemplate e includi HTML", non come "analizza questo subtemplate e includi i suoi contenuti come se fosse parte del genitore". Ciò significa che non esiste uno stato condiviso tra i modelli inclusi: ogni inclusione è un processo di rendering completamente indipendente.

I blocchi vengono valutati prima di essere inclusi. Ciò significa che un modello che include blocchi di un altro conterrà blocchi che sono già stati valutati e renderizzati, non blocchi che possono essere sovrascritti, ad esempio, da un modello estendibile.

In tal caso, ti consiglio di utilizzare django-sekizai , che ti consente di fare cose come:

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

Da django-sekizai README :

Il motivo principale per cui ho iniziato questo progetto è stata la mancanza di un buon framework multimediale (css / js) in django e django-cms. Sì, c'è la classe Media usata nei moduli in django, ma in realtà non funziona così bene. Di solito i ragazzi del frontend vogliono decidere se includere file css e javascript e non vogliono dover modificare i file Python per cambiarli né io volevo che cambiassero i miei file Python. Quindi c'era la necessità di permetterti di modificare il contenuto dei modelli che sono prima o dopo il punto in cui ti trovi ora. Inoltre volevo che i duplicati fossero rimossi. Di conseguenza ho scritto django-sekizai, che fa esattamente questo. È simile ai blocchi, solo che invece di ereditarli, li estendi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.