[解決済み] django テンプレートで、カスタムテンプレートフィルタに複数の引数を追加するには?
2023-01-15 01:34:29
質問
私のカスタムフィルタです。
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 のドキュメント と 書籍 が、単一の引数を使用する例しか見つかりませんでした...それは可能なのでしょうか?
どのように解決するのですか?
可能です。
Django はフィルタの引数を一つしか許しませんが、すべての引数をカンマで区切って一つの文字列にすることができない理由はありません。
ですから、例えば、変数 X がリスト [1,2,3,4] の中にあるかどうかをチェックするフィルタが欲しい場合、次のようなテンプレートフィルタが必要になります。
{% if X|is_in:"1,2,3,4" %}
さて、このようにtemplatetagを作成します。
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(',')]
EDIT: さて、パラメータとしてキーと値のペアを使うことであなたの質問に具体的に答えますと、Django が URL からクエリ文字列をパースするのに使うのと同じクラスを使うことができ、これは settings.py に従って適切に文字エンコーディングを処理する利点も持っています。
つまり、クエリ文字列と同じように、各パラメータは '&' で区切られます。
{{ 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',''))
関連
-
Django の ForeignKey パラメータの使用法
-
Djangoキャッシュの説明
-
[解決済み] Djangoのバージョンを確認する方法
-
[解決済み] Django のカスタムフィールドで User モデルを拡張する
-
[解決済み] Django のフォームで、あるフィールドを編集できないように readonly (または disabled) にするにはどうしたらいいですか?
-
[解決済み] Django テンプレート内で現在の URL を取得する方法は?
-
[解決済み] Django - テンプレートのforループで番号を反復する
-
[解決済み】AngularJSとDjangoの組み合わせ - テンプレートタグの衝突
-
[解決済み] Django のモデルで電話番号を保存する最良の方法は何ですか?
-
[解決済み] シグナルハンドラは django プロジェクトのどこにあるべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AttributeError: 'str' オブジェクトには 'decode' という属性がありません。
-
ImproperlyConfiguredです。INSTALLED_APPS の設定を要求されたが、設定されていない
-
[解決済み] Django で完全な/絶対的な URL (ドメイン付き) を取得するにはどうすればよいですか?
-
[解決済み] (13: Permission denied) 上流:[nginx]に接続中。
-
[解決済み] Django REST フレームワーク: 非モデルシリアライザー
-
[解決済み] Django で null を許容するユニークなフィールド
-
[解決済み] Django Forms: 有効でない場合、エラーメッセージとともにフォームを表示する
-
[解決済み] django のモデルのクラス名を取得する
-
[解決済み] Django で https 接続を非 https 接続と同じように簡単にテストするには 'runserver' を使うには?
-
[解決済み] Django の日付テンプレートのデフォルトフォーマットを変更するには?