Я тоже столкнулся с такой же необходимостью повторения {% block%} в моих файлах шаблонов. Проблема в том, что я хочу, чтобы Django {% block%} использовался в любом случае условного выражения Django, и я хочу, чтобы {% block%} был перезаписан последующими файлами, которые могут расширить текущий файл. (Таким образом, в данном случае то, что я хочу, - это определенно больше блока, чем переменной, потому что я не использую его технически, он просто появляется на любом конце условного выражения.
Проблема:
Следующий код шаблона Django приведет к ошибке синтаксиса шаблона, но я думаю, что допустимо «хотеть» иметь определенный {% block%}, повторно используемый в условном выражении (IE, почему синтаксический анализатор синтаксического анализа Django проверяет синтаксис на обоих концах условия, разве это не должно проверять только условие ИСТИНА?)
# 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 %}
Решение:
Вы можете использовать {% include%} для условной вставки {% block%} более одного раза. Это сработало для меня, потому что проверка синтаксиса Django включает в себя только ИСТИНА {% include%}. Смотрите результат ниже:
# 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 %}