django:过滤器无效

Posted

技术标签:

【中文标题】django:过滤器无效【英文标题】:django: Invalid filter 【发布时间】:2011-08-02 01:26:33 【问题描述】:

我有一个文章应用程序并尝试制作一个自定义过滤器,我在文章应用程序中有一个名为 templatetags 的目录,该目录中有一个 tags.py,这是目录结构。

-manage.py(f)
-settings.py(f)
-articles(d)
 - templatetags(d)
  - tags.py(f)

在模板上,文章有自己的目录,所有文章模板都是从一个base.html模板扩展而来,这里是模板结构。

-base.html(f)
-articles(d)
 -index.html(f)

我在 base.html % load tags % 中加载标签,并在 index.html 中使用自定义过滤器并得到无效过滤器错误。

tags.py

from django import template                                                                                                                                                        
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
@stringfilter
def space2Dash(s):
    return s.replace(' ', '_');

我就是想不通我做错了什么。

编辑: 我将过滤器名称更改为abcfilter.py,并在我的settings.py 中加载了文章应用程序

articles/index.html

 % load abcfilter %
  "foo bar"|space2dash 

错误:

Request Method: GET
Request URL:    http://localhost:8080/articles/
Django Version: 1.2.5
Exception Type: TemplateSyntaxError
Exception Value:    
Invalid filter: 'space2dash'
Exception Location: ***/lib/python2.7/django/template/__init__.py in find_filter, line 363
Python Executable:  /usr/local/bin/python
Python Version: 2.7.1
Server time:    Sun, 10 Apr 2011 07:55:54 -0500

【问题讨论】:

【参考方案1】:

仅供参考,我通过移动解决了问题

% load ... %

从基本模板到具体模板。 另请参阅此帖子https://***.com/a/10427321/3198502

【讨论】:

为我工作。将它放在基本模板中似乎根本不起作用 我遇到了同样的问题。有谁知道为什么会这样?【参考方案2】:

首先删除替换后的分号。

templatetags 目录下是否有一个名为__init__.py 的文件(假设在init 前后有2 个下划线,很难在编辑器中格式化。)?

如果您还没有看过,这里是一个包含大量信息的好页面。

http://docs.djangoproject.com/en/dev/howto/custom-template-tags/

【讨论】:

感谢您的回答,删除符号后,错误仍然存​​在。(仅供参考,我在 templatetags 目录中有一个空的 init.py 并且我已阅读文档页面几次,但我不知道我做错了什么) 尝试将文件从标签重命名为其他名称。也许标签是一个保留字。您是否在设置文件中注册了文章应用程序?你能发布确切的错误和你用来调用标签的 HTML 吗? 我已将 tags.py 更改为 abcfilter.py 并检查上述模板中的错误和 html 不确定转移到 SO 时是否是拼写错误,但 "foo bar"|space2dash % 应该是 "foo bar"|space2dash 您的方法也称为 space2Dash 但是您正在引用 space2dash(全部小写)。 谢谢肯,我想我要从亚马逊订购一顶帽子并吃掉它(问题是我有一个 space2Dash,大写的 D :)【参考方案3】:

我几乎被这个问题发疯了,以上答案都没有帮助。

如果您有多个应用程序,请确保包含您的自定义标签/过滤器的文件名是唯一的,最好是app_name_filters.py。否则 Django 只会从它首先找到匹配的应用程序中加载自定义过滤器!

【讨论】:

谢谢你!你触发我检查它...我的部署例程不会删除服务器上的旧文件。所以它在本地工作,并在测试中,但不在服务器上。我迷路了。你救了我! 不知何故,即使这对我也不起作用(我只是在谈论本地环境)。 :( Django 有时会非常奇怪。【参考方案4】:

为避免使用% load MODULE_NAME % 在每个模板中加载模块,您可以在settings.py 中将其添加为'builtin'

TEMPLATES = [
    
        'OPTIONS': 
            ...
            ,
            'builtins': [
                ...
                'APP_NAME.templatetags.MODULE_NAME',
                ]
        ,
    ,
]

【讨论】:

以上是关于django:过滤器无效的主要内容,如果未能解决你的问题,请参考以下文章

Django 自定义过滤器错误。返回“无效过滤器”

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

使用 templatetags 方法的 Django 自定义过滤器不起作用!异常值为:无效过滤器:'dict_'

尝试在 Django 中的表单上使用脆表单过滤器时收到“无效表单:脆”错误,但仅在一个 django 应用程序中而不是另一个?

Django DatabaseError timedelta的无效连接器

Django:从查询集中删除过滤条件