Django中的条件包含标记

时间:2012-06-08 13:58:31

标签: django django-templates

我遇到了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

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

2 个答案:

答案 0 :(得分:6)

Django的优化包括编译时由常量给出的模板。

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

{% include test_template %}

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

答案 1 :(得分:-1)

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

{% include "test.html" %}

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

所以这里有一个更自包含的方法来实现相同的结果 - 将包裹包装在with中:

{% with "test.html" as path %}
    {% include path %}
{% endwith %}