我的Django项目中有一个python文件,其中包含自定义模板标记和自定义模板过滤器。
我的自定义标记使用template.loader.get_template()
加载另一个模板文件。这很有效......直到我将自定义过滤器添加到加载的模板中。
现在我得到一个Django“无效过滤器”TemplateSyntaxError
异常。看看调用堆栈,Django无法加载我的模板过滤器。
这是事情变得奇怪的地方。我可以使用其他模板中的自定义过滤器。我可以在我的自定义标记加载的模板中使用任何其他过滤器。但是我不能在我自己的自定义标签中使用我自己的过滤器。
显而易见的原因是我的自定义标记/过滤器文件没有加载到我的模板HTML中,但我正确加载它。 (因为当我不加载它时,我会得到一个不同的错误 - “无效的块标记”)
我在Python 2.7上运行Django 1.2.3。
[顺便说一下,我终于找到了答案,但我花了几个小时才能在stackoverflow或谷歌的任何地方找到答案,所以我要回答我自己的问题,以便其他人不必浪费尽可能多的时间]
答案 0 :(得分:7)
答案非常简单:将自定义标记和自定义过滤器拆分为两个单独的python文件,它将起作用。
我怀疑问题是这样的:自定义标记使用template.loader.get_template()
加载另一个模板。该模板文件包含{% load %}
标记,该标记尝试加载定义父自定义标记的同一文件。出于某种原因,这不起作用 - 可能是因为它会导致无限循环,或者因为Django认为它已经加载了。
我没有尝试在过滤器中重新加载自定义标签,或者在另一个标签内加载标签,以查看是否也出现同样的问题,但如果确实如此,则修复将是相同的:如果您想要使用template.loader.get_template()
加载包含对您自己的自定义标记或过滤器的调用的模板,确保调用template.loader.get_template()
的文件与定义包含的标记/文件管理器的文件不同。