web-dev-qa-db-ja.com

django:無効なフィルター

記事アプリを入手してカスタムフィルターを作成しようとしています。記事アプリに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
22
vito huang

置換後、最初にセミコロンを削除します。

Templatetagsディレクトリの下に__init__.pyというファイルがあります(これは、initの前後に2つのアンダースコアがあり、エディターでフォーマットするのが難しいと想定されています)。

あなたがまだ見ていないなら、ここにたくさんの情報がある良いページがあります。

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

18
Ken Cochrane

参考までに、移動して問題を解決しました

{% load ... %}

基本テンプレートから具象テンプレートへ。この投稿もご覧ください https://stackoverflow.com/a/10427321/3198502

16
mkiesner

私はこの問題にほとんど夢中になり、上記の答えのどれも助けになりませんでした。

アプリが複数ある場合は、カスタムタグ/フィルタを含むファイル名が一意であるようにしてください。できればapp_name_filters.py。それ以外の場合Djangoは、最初に一致するアプリを見つけたアプリからのみカスタムフィルターをロードします!

12
Meilo