101

これが私のカスタムフィルターです:

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のドキュメントを調べましたが、単一の引数を使用した例しか見つかりませんでした...それは可能ですか?

4

9 に答える 9

113

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

Djangoでは、フィルターに対して1つの引数しか許可されていませんが、コンマを使用してすべての引数を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',''))
于 2009-01-08T02:35:47.863 に答える
25

このように簡単です。

@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 }}
于 2014-06-25T07:26:45.503 に答える
3

<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" }}
于 2010-04-08T13:16:58.760 に答える
-2

悪い考えですが、うまくいきます:

{{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }}

@register.filter
def input_by_xpath(device, args): 
    args = eval(args)
    ...
    result = "<input type=\"%s\" value=\"%s\" name=\"%s\"/>"%(args['type'],value,args['xpath'])
    return mark_safe(result)
于 2009-03-13T20:08:44.317 に答える