djangoテンプレートのカスタムテンプレートフィルターに複数の引数を追加するにはどうすればよいですか?
-
05-07-2019 - |
質問
カスタムフィルタは次のとおりです:
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 しかし、1つの引数を使用した例のみが見つかりました...それは可能ですか?
解決
それは可能であり、かなり簡単です。
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。
そのため、クエリ文字列と同様に、各パラメーターは「<!> amp;」で区切られています:
{{ attr.name|replace:"cherche=_&remplacement= " }}
この場合、replace関数は次のようになります。
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',''))
他のヒント
カスタムフィルターは、1つまたは2つの引数を取るPython関数です。
- 変数の値(入力)- 必ずしも文字列ではありません。
- 引数の値-これには デフォルト値、または完全に省略されます。
フィルターの代わりに、タグを単純なタグとして登録します。それらは複数の引数を取ることができます。呼び出すための構文は少し異なりますが、それは単なる構文上の砂糖の変更です。
このように簡単です。
@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 }}
この機能は、2013 DjangoのTracでWONTFIXとしてマークされています: http://code.djangoproject.com / ticket / 1199
<!> lt; my-site <!> gt; /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" }}
これを行うことができます:
{% assign find_total_issued = dailysalesreport | find: "TotalIssued":"13" %}
public static List<object> Find(object collection, string column, string value)
そして、関数の抽象化がsjare
であるため、宛先に到達します。
これは悪い考えですが、うまくいきます:
{{ xml|input_by_xpath:"{'type':'radio','xpath':'//result/value'}" }}
and
@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)