Skip to main content
 首页 » 编程设计

python之我的自定义 Django 模板过滤器出现 "Invalid Filter"错误,但任何其他过滤器都没有

2025年05月04日38lexus

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

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

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

这就是事情变得奇怪的地方。我可以使用来自另一个模板的自定义过滤器。我可以在自定义标签加载的模板中使用任何其他过滤器。但是我不能在我自己的自定义标签中使用我自己的过滤器。

造成这种情况的明显原因是没有在我的模板 HTML 中加载我的自定义标签/过滤器文件,但我正确地加载了它。 (因为当我不加载它时,我会得到一个不同的错误——“无效的 block 标记”)

我在 Python 2.7 上运行 Django 1.2.3。

[顺便说一句,我终于自己找到了答案,但我花了几个小时,而且我无法在 stackoverflow 或谷歌上的任何地方找到答案,所以我要回答我自己的问题,以便其他人不会像我一样浪费那么多时间]

请您参考如下方法:

答案非常简单:将自定义标签和自定义过滤器拆分成两个单独的 python 文件,它就可以工作。

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

我没有尝试在过滤器中递归加载自定义标签,或在另一个标签中加载标签,以查看是否也出现同样的问题,但如果出现,修复方法是相同的:如果你想使用 template.loader.get_template() 加载包含调用您自己的自定义标签或过滤器的模板,确保调用 template.loader.get_template() 的文件与定义包含的标签/文件管理器的文件不同。