我也遇到了在我的模板文件中重复 {% block %} 的同样需要。问题是我希望在 Django 条件的任何一种情况下都使用 Django {% block %},并且我希望 {% 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 语法检查器仅包含 TRUTHY {% 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 %}