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

Posted

技术标签:

【中文标题】我的自定义 Django 模板过滤器但没有任何其他过滤器的“无效过滤器”错误【英文标题】:"Invalid Filter" error for my custom Django template filters but not any other filters 【发布时间】:2011-05-23 23:02:36 【问题描述】:

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

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

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

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

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

我在 Python 2.7 上运行 Django 1.2.3。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于我的自定义 Django 模板过滤器但没有任何其他过滤器的“无效过滤器”错误的主要内容,如果未能解决你的问题,请参考以下文章

“模板语法错误:过滤器无效:”;基于 django 文档的自定义 django 模板过滤器损坏,但模板标签有效

Django 找不到我的自定义模板过滤器

Django将多个参数传递给If语句中的自定义模板过滤器

我可以将我的自定义模板标签文件夹移到我的应用程序之外吗?

Django中的自定义过滤器

Django:自定义模板简单标签应该引发异常还是静默失败?