Respostas:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
Usar block.super
funciona 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.super
o 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" %}
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.