【问题标题】:django: Invalid filterdjango:过滤器无效
【发布时间】: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

【问题讨论】:

    标签: django django-template-filters


    【解决方案1】:

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

    {% load ... %}
    

    从基本模板到具体模板。 另请参阅此帖子https://stackoverflow.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',
                    ]
            },
        },
    ]
    

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 2013-04-09
      • 2019-02-25
      • 2018-03-15
      • 2018-07-28
      • 2018-12-09
      • 2019-01-31
      • 2020-12-24
      • 2021-05-26
      相关资源
      最近更新 更多