Eu também encontrei a mesma necessidade de repetir {% block%} nos meus arquivos de modelo. O problema é que eu quero que um Django {% block%} seja usado nos dois casos de uma condição condicional do Django, e quero que o {% block%} seja sobrescrito pelos arquivos subseqüentes que podem estender o arquivo atual. (Portanto, nesse caso, o que eu quero é definitivamente mais um bloco do que uma variável, porque eu não estou tecnicamente reutilizando, apenas aparece nas duas extremidades de uma condicional.
O problema:
O código de modelo do Django a seguir resultará em um erro de sintaxe de modelo, mas acho que é um "desejo" válido ter um {% block%} definido reutilizado em uma condicional (IE, por que o analisador Django está validando a sintaxe em AMBOS OS TERMOS condicional, não deveria apenas validar a condição TRUTHY?)
# This example shows a {{ DEBUG }} conditional that loads
# Uncompressed JavaScript files if TRUE
# and loads Asynchronous minified JavaScript files if FALSE.
# BASE.html
{% if DEBUG %}
<script src="{{MEDIA_URL}}js/flatfile.1.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.2.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.3.js"></script>
<script type="text/javascript">
{% block page_js %}
var page = new $site.Page();
{% endblock page_js %}
</script>
{% else %}
<script type="text/javascript">
// load in the PRODUCTION VERSION of the site
// minified and asynchronosly loaded
yepnope([
{
load : '{MEDIA_URL}}js/flatfiles.min.js',
wait : true,
complete : function() {
{% block page_js %} // NOTE THE PAGE_JS BLOCK
var page = new $site.Page();
{% endblock page_js %}
}
}
)];
</script>
{% endif %}
# ABOUT.html
{% extends 'pages/base.html' %}
{% block page_js %}
var page = new $site.Page.About();
{% endblock page_js %}
A solução:
Você pode usar um {% include%} para inserir condicionalmente um {% block%} mais de uma vez. Isso funcionou para mim porque o verificador de sintaxe do Django inclui apenas o TRUTHY {% include%}. Veja o resultado abaixo:
# partials/page.js
{% block page_js %}
var page = new $site.Page();
{% endblock %}
# base.html
{% if DEBUG %}
<script src="{{MEDIA_URL}}js/flatfile.1.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.2.js"></script>
<script src="{{MEDIA_URL}}js/flatfile.3.js"></script>
<script type="text/javascript">
{% include 'partials/page_js.html' %}
</script>
{% else %}
<script type="text/javascript">
yepnope([
{
load : '{MEDIA_URL}}js/flatfiles.min.js',
wait : true,
complete : function() {
{% include 'partials/page_js.html' %}
}
}
)];
</script>
{% endif %}