我的自定义Django模板过滤器的"无效过滤器"错误,但没有任何其他过滤器

Jus*_*ant 1 python django django-templates django-template-filters

我的Django项目中有一个python文件,其中包含自定义模板标记和自定义模板过滤器.

我的自定义标记用于template.loader.get_template()加载另一个模板文件.这很好用......直到我将自定义过滤器添加到加载的模板中.

现在我得到一个Django"Invalid Filter" TemplateSyntaxError异常.看看调用堆栈,Django无法加载我的模板过滤器.

事情变得奇怪了.我可以使用其他模板中的自定义过滤器.我可以在我的自定义标记加载的模板中使用任何其他过滤器.但是我不能在我自己的自定义标签中使用我自己的过滤器.

显而易见的原因是没有在我的模板HTML中加载我的自定义标记/过滤器文件,但我正确加载它.(因为当我不加载它时,我会得到一个不同的错误 - "无效的块标记")

我在Python 2.7上运行Django 1.2.3.

[顺便说一下,我终于找到了答案,但是我花了好几个小时才能在stackoverflow或google上的任何地方找到答案,所以我要回答我自己的问题,以便其他人不必浪费和我一样多的时间]

Jus*_*ant 7

答案非常简单:将自定义标记和自定义过滤器拆分为两个单独的python文件,它将起作用.

我怀疑问题是这样的:自定义标记template.loader.get_template()用于加载另一个模板.该模板文件包含一个{% load %}标记,该标记尝试加载定义父自定义标记的同一文件.出于某种原因,这不起作用 - 可能是因为它会导致无限循环,或者因为Django认为它已经加载了.

我没有尝试在过滤器中重新加载自定义标签,或者在另一个标签内部加载标签,以查看是否也出现同样的问题,但如果确实如此,则修复将是相同的:如果您要使用template.loader.get_template()加载包含对您自己的自定义标记或过滤器的调用的模板,请确保文件调用template.loader.get_template()与定义包含的标记/文件管理器的文件不同.