自定义Django模板过滤器出现"无效过滤器"错误,但其他过滤器正常
我在我的Django项目里有一个Python文件,里面包含了自定义的模板标签和自定义的模板过滤器。
我的自定义标签使用了template.loader.get_template()
来加载另一个模板文件。这一切都运行得很好……直到我在加载的模板里添加了我的自定义过滤器。
现在我遇到了Django的“无效过滤器”TemplateSyntaxError
异常。查看调用栈后,Django无法加载我的模板过滤器。
事情变得有点奇怪。我可以在另一个模板中使用我的自定义过滤器。我可以在我的自定义标签加载的模板中使用任何其他过滤器。但是我就是不能在我自己的自定义标签里使用我自己的过滤器。
显而易见的原因可能是我没有在模板HTML中加载我的自定义标签/过滤器文件,但我实际上是正确加载了的。(因为如果我不加载,就会出现不同的错误——“无效的块标签”)
我在Python 2.7上运行Django 1.2.3。
[顺便说一下,我最后自己找到了答案,但花了我好几个小时,而且在stackoverflow或谷歌上都找不到答案,所以我打算回答我自己的问题,这样其他人就不必像我一样浪费这么多时间]
1 个回答
这个问题的解决方法其实很简单:把自定义标签和自定义过滤器分成两个不同的 Python 文件,这样就能正常工作了。
我猜问题出在这里:自定义标签使用了 template.loader.get_template()
来加载另一个模板。那个模板文件里有一个 {% load %}
标签,它试图加载定义了父自定义标签的同一个文件。出于某种原因,这样做不行——可能是因为这样会导致无限循环,或者 Django 认为这个文件已经加载过了。
我没有尝试在过滤器里递归加载自定义标签,或者在一个标签里加载另一个标签,看看是否也会出现同样的问题,但如果出现了,解决方法也是一样的:如果你想用 template.loader.get_template()
来加载一个包含你自己自定义标签或过滤器调用的模板,确保调用 template.loader.get_template()
的文件和定义你要包含的标签/过滤器的文件是不同的。