web-dev-qa-db-ja.com

Djangoテンプレートでカスタムテンプレートフィルターに複数の引数を追加するにはどうすればよいですか?

カスタムフィルターは次のとおりです。

from Django import template

register = template.Library()

@register.filter
def replace(value, cherche, remplacement):
    return value.replace(cherche, remplacement)

そして、エラーになったテンプレートファイルで使用しようとした方法は次のとおりです。

{{ attr.name|replace:"_"," " }}
{{ attr.name|replace:"_" " " }}
{{ attr.name|replace:"_":" " }}
{{ attr.name|replace:"cherche='_', remplacement=' '" }}

Djangoのドキュメント および book を調べましたが、単一の引数を使用した例のみが見つかりました...

79
bchhun

それは可能であり、かなり簡単です。

Djangoはフィルターに1つの引数のみを許可しますが、すべての引数をコンマで区切って単一の文字列に入れることができない理由はありません。

そのため、たとえば、変数Xがリスト[1,2,3,4]にあるかどうかをチェックするフィルターが必要な場合、次のようなテンプレートフィルターが必要になります。

{% if X|is_in:"1,2,3,4" %}

これで、次のようにテンプレートタグを作成できます。

from Django.template import Library

register = Library()

def is_in(var, args):
    if args is None:
        return False
    arg_list = [arg.strip() for arg in args.split(',')]
    return var in arg_list

register.filter(is_in)

Arg_listを作成する行は、すべてのコンマでargs文字列を分割し、先頭および末尾のスペースを削除するために.strip()を呼び出すジェネレーター式です。

たとえば、3番目の引数がintの場合、次のようにします。

arg_list[2] = int(arg_list[2])

または、それらすべてがintである場合:

arg_list = [int(arg) for arg in args.split(',')]

編集:パラメータとしてキーと値のペアを使用して質問に具体的に答えるために、同じクラスDjangoを使用してURLからクエリ文字列を解析することができます。 settings.pyに従って適切に文字エンコード。

そのため、クエリ文字列と同様に、各パラメーターは「&」で区切られています。

{{ attr.name|replace:"cherche=_&remplacement= " }}

置換関数は次のようになります。

from Django import template
from Django.http import QueryDict

register = template.Library()

@register.filter
def replace(value, args):
    qs = QueryDict(args)
    if qs.has_key('cherche') and qs.has_key('remplacement'):
        return value.replace(qs['cherche'], qs['remplacement'])
    else:
        return value

いくつかの誤った交換を行うリスクがあるため、この速度を上げることができます。

qs = QueryDict(args)
return value.replace(qs.get('cherche',''), qs.get('remplacement',''))
100
Van Gale

ドキュメントの このセクション に従って不可能

カスタムフィルターはPython 1つまたは2つの引数を取る関数です。

  • 変数の値(入力)-必ずしも文字列ではありません。
  • 引数の値-これはデフォルト値を持つことも、完全に省略することもできます。
17
Jeff Bauer

このように簡単です。

@register.filter(name='one_more')
def one_more(_1, _2):
    return _1, _2

def your_filter(_1_2, _3)
    _1, _2 = _1_2
    print "now you have three arguments, enjoy"

{{ _1|one_more:_2|your_filter:_3 }}
10
gshmu

フィルタの代わりに、タグを単純なタグとして登録します。それらは複数の引数を取ることができます。それを呼び出すための構文は少し異なりますが、それは単なる構文上の砂糖の変更です。

10
dragonroot

この機能は2013 DjangoのTracでWONTFIXとしてマークされています: http://code.djangoproject.com/ticket/1199

4
bchhun

<my-site> /globaltags/replace.py

from Django.template import Library

import re

register = Library()

def search(value, search):
    return re.sub(search, '#f4x@SgXXmS', value)

def replace(value, replace):
    return re.sub('#f4x@SgXXmS', replace, value)

register.filter(search)
register.filter(replace)

テンプレート内:

{{ "saniel"|search:"s"|replace:"d" }}
2
theosp