Pouvons-nous ajouter à un {% block%} plutôt que l'écraser?

116

Dans mon core.html, j'ai un bloc étiqueté javascript. Ce serait formidable si je pouvais ajouter plus de lignes à ce bloc sans tout écraser.

PKKid
la source

Réponses:

9

L'utilisation block.superfonctionne bien lors de l'extension d'un modèle, mais pas aussi bien lors de l'inclusion d'un, c'est-à-dire:

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

Supposons que vous souhaitiez inclure un modèle au milieu de votre page et que vous souhaitiez également qu'il ajoute du javascript dans un bloc à la fin de la page: l'appel block.superdans le modèle inclus plantera.

Cf. Django issues # 7324 , # 12008 , # 13399 et la mise à jour associée à la documentation . Cf. inclure la note de balise :

La balise include doit être considérée comme une implémentation de «rendre ce sous-modèle et inclure le HTML», et non comme «analyser ce sous-modèle et inclure son contenu comme s'il faisait partie du parent». Cela signifie qu'il n'y a pas d'état partagé entre les modèles inclus - chaque inclusion est un processus de rendu complètement indépendant.

Les blocs sont évalués avant d'être inclus. Cela signifie qu'un modèle qui inclut des blocs d'un autre contiendra des blocs qui ont déjà été évalués et rendus - pas des blocs qui peuvent être remplacés, par exemple, par un modèle d'extension.

Dans ce cas, je recommanderais d'utiliser django-sekizai , qui vous permet de faire des choses comme:

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

Depuis django-sekizai README :

La raison principale pour laquelle j'ai commencé ce projet était le manque d'un bon framework média (css / js) dans django et le django-cms. Oui, il y a la classe Media utilisée dans les formulaires de django, mais vraiment cela ne fonctionne pas très bien. Habituellement, les gars du frontend veulent décider des fichiers css et javascript à inclure et ils ne veulent pas avoir à modifier les fichiers Python pour changer que je ne voulais pas non plus qu'ils modifient mes fichiers Python. Par conséquent, il était nécessaire de vous permettre de modifier le contenu des modèles qui sont avant ou après le point où vous vous trouvez maintenant. Je voulais également que les doublons soient supprimés. En conséquence, j'ai écrit django-sekizai, qui fait exactement cela. C'est similaire aux blocs, au lieu d'en hériter, vous les étendez.

Maxime R.
la source