5

我遇到了 Django 模板系统的非常奇怪的行为。我有一个模板文件,即test.html,它递归地包含自己:

{% include "test.html" %}

当然,这样的模板没有机会被渲染,因为没有完成条件。好的,让我们尝试以下方法:

{% if test_false %}{% include "test.html" %}{% endif %},

其中test_false是传递给模板的变量并且等于False

人们期望它不包含任何内容,但它确实:

RuntimeError at /test/
maximum recursion depth exceeded while calling a Python object

我不明白。包含标签可以从当前上下文中获取参数,所以我怀疑它是在页面的任何其他部分之前执行的。那它为什么会忽略条件标签呢?

4

2 回答 2

7

Django 进行了优化,包括在编译时由常量给出的模板。

将模板的名称设置为变量并以这种方式包含它:

{% include test_template %}

Django 将无法使用它的优化,您的代码应该可以工作。

于 2012-06-08T14:19:55.293 回答
1

就像 Thomasz 说的,如果路径在包含模板中定义为常量字符串,Django 只能进行这种优化 - 如下所示:

{% include "test.html" %}

但我宁愿不必将模板路径放在 Python 代码的上下文中。

因此,这是一种实现相同结果的更独立的方法 - 将 include 包装在 a 中with

{% with "test.html" as path %}
    {% include path %}
{% endwith %}
于 2016-05-31T16:04:59.700 回答