Djangoカスタムテンプレートフィルタ

4496 ワード

Djangoカスタムテンプレートフィルタ(register.filter)
djangoのテンプレート言語には独自のフィルタがありますが、これらの独自のフィルタが足りないと感じる場合があります.Pythonを使用してカスタムタグとフィルタを定義することで、テンプレートエンジンを拡張し、タグを使用してテンプレートに提供することができます.
コードレイアウト
  • まずappパッケージの下にtemplatetagsパッケージ(init.py)
  • を作成する必要があります.
  • その後、このパッケージでカスタムタグ/フィルタフォルダを作成できます(モジュールファイルの名前は、後でタグをロードするために使用する名前ですので、他のアプリケーションのカスタムタグやフィルタと競合しない名前を慎重に選択してください).例えば:mytag.py
  • カスタムフィルタメソッドを書き終わったら、テンプレートにこのファイル{% load mytag.py %}をインポートします(これは、テンプレートを変更してmytag.pyをロードすることを意味します)
  • あなたのフィルターを書く
  • まずtemplateをインポートする必要があります(テンプレートフォルダではなくdjangoが持っているtemplateモジュールに注意してください).ここではtemplate.Libraryのインスタンスを登録して、フィルタを有効にする必要があります.mytagで.py上部入力:
  • from django import template
    register = template.Library()
    
  • カスタムフィルタは、1~2つのパラメータを持つPythonの関数
  • です.
    1>(入力された)変数の値は、文字列タイプ2>とは限りません.パラメータの値は、デフォルト値を持つか、フィルタを書くなど、除外できます.
    def cut(value, arg):
        """
                  value   arg   ''
        """
        return value.replace(arg, '')
    

    テンプレートhtmlでは、
    {{ somevariable|cut:"0" }} #      cut                '0'    
    

    注意:この場合、自分で作成したフィルタはテンプレートで有効になりません.マークする必要があります.
    さっきのregisterが役に立ちます
    @register.filter(name='cut')
    #       name  ,            ,Django               。
    def cut(value, arg):
        return value.replace(arg, '')
    

    バックグラウンドから送られてくる変数が文字列ではなく整数であることを心配する場合(整数はAttributeErrorを引き起こすため)、装飾器stringfilterを使用します.
    from django import template
    from django.template.defaultfilters import stringfilter
    
    register = template.Library()
    
    @register.filter
    @stringfilter #                       
    def cut(value, arg):
        return value.replace(arg, '')
    

    後ろにregisterがあります.simple_tag