Podemos acrescentar a um {% block%} em vez de sobrescrever?

116

No meu core.html, tenho um bloco denominado javascript. Seria ótimo se eu pudesse acrescentar mais linhas a este bloco sem sobrescrever tudo nele.

PKKid
fonte

Respostas:

9

Usar block.superfunciona bem ao estender um modelo, mas não tão bem ao incluir um, ou seja:

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

Digamos que você queira incluir um modelo no meio de sua página e também gostaria de adicionar algum javascript em um bloco no final da página: chamar block.supero modelo incluído irá travar.

Cf. Problemas do Django # 7324 , # 12008 , # 13399 e a atualização relacionada à documentação . Cf. incluir nota de tag :

A tag de inclusão deve ser considerada como uma implementação de “renderizar este submodelo e incluir o HTML”, não como “analisar este submodelo e incluir seu conteúdo como se fosse parte do pai”. Isso significa que não há estado compartilhado entre os modelos incluídos - cada inclusão é um processo de renderização completamente independente.

Os blocos são avaliados antes de serem incluídos. Isso significa que um modelo que inclui blocos de outro conterá blocos que já foram avaliados e renderizados - não blocos que podem ser substituídos por, por exemplo, um modelo estendido.

Nesse caso, eu recomendo usar django-sekizai , que permite que você faça coisas como:

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

Do README de django-sekizai :

O principal motivo pelo qual comecei este projeto foi a falta de um bom framework de mídia (css / js) no django e no django-cms. Sim, existe a classe Media usada em formulários no django, mas realmente não funciona muito bem. Normalmente, os caras do front-end querem decidir sobre os arquivos css e javascript a serem incluídos e não querem ter que editar os arquivos Python para mudar isso, nem eu queria que eles mudassem meus arquivos Python. Por isso, houve a necessidade de permitir que você edite o conteúdo dos modelos que estão antes ou depois do ponto em que você está agora. Também queria que as duplicatas fossem removidas. Como resultado, escrevi django-sekizai, que faz exatamente isso. É semelhante a blocos, apenas em vez de herdá-los, você os estende.

Maxime R.
fonte