FlaskでのJinjia 2の使用(二)

24759 ワード

プロセス制御
主に2つあります.
- if/else if /else / endif
- for / endfor

if文
Jinja 2構文のif文はPythonのif文と似ています.後のブール値またはブール値を返す式は、コード内のどのプロセスが実行されるかを決定します.
{%if user.is_logged_in() %}
    <a href='/logout'>Logout</a>
{% else %}
    <a href='/login'>Login</a>
{% endif %}

フィルタはif文で使用できます.
{% if comments | length > 0 %}
    There are {{ comments | length }} comments
{% else %}
    There are no comments
{% endif %}

ループステートメント
  • Jinja 2でループを使用して任意のリストまたはジェネレータ関数
  • を反復できます.
    {% for post in posts %}
        <div>
            <h1>{{ post.title }}</h1>
            <p>{{ post.text | safe }}</p>
        </div>
    {% endfor %}
    
  • ループとif文を組み合わせて、Pythonループのcontinue機能をシミュレートすることができ、次のループはpostのみをレンダリングする.textはNoneではないpost:
  • {% for post in posts if post.text %}
        <div>
            <h1>{{ post.title }}</h1>
            <p>{{ post.text | safe }}</p>
        </div>
    {% endfor %}
    
  • forループブロックでは、これらの特殊な変数にアクセスできます.
  • 変数#ヘンスウ#
    説明
    loop.index
    現在のループ反復回数(1から)
    loop.index0
    現在のループ反復回数(0から)
    loop.revindex
    ループ終了まで反復が必要な回数(1から)
    loop.revindex0
    ループ終了までに反復が必要な回数(0から)
    loop.first
    最初の反復の場合はTrueです.
    loop.last
    最後の反復であればTrueです.
    loop.length
    シーケンス内のアイテム数.
    loop.cycle
    一連のシーケンス間で値をとる補助関数.次の例のプログラムを参照してください.
  • ループの内部では、loopという特殊な変数を使用してforループに関するいくつかの情報を得ることができます.
  • 例えば、現在反復されている要素のシーケンス番号を知り、Pythonのenumerate関数をシミュレートしたい場合は、loop変数のindexプロパティを使用します.たとえば、
  • {% for post in posts%}
    {{loop.index}}, {{post.title}}
    {% endfor %}
    
  • は、このような結果
  • を出力する.
    1, Post title
    2, Second Post
    
  • cycle関数は、ループのたびにそのパラメータの次の要素を返します.上記の例で説明します.
  • {% for post in posts%}
    {{loop.cycle('odd','even')}} {{post.title}}
    {% endfor %}
    
  • は、
  • という結果を出力します.
    odd Post Title
    even Second Post
    

    フィルタ
    フィルタの本質は関数です.変数の値を出力するだけでなく、変数の表示、フォーマット、演算などを変更する必要がある場合がありますが、テンプレートではPythonのいくつかの方法を直接呼び出すことができない場合があります.これはフィルタに使用されます.
    使用方法:
  • フィルタの使用方法は、変数名|フィルタです.
  • {{variable | filter_name(*args)}}
    
  • フィルタに伝達するパラメータがなければ、括弧を
  • を省略することができる.
    {{variable | filter_name }}
    
  • 例えば:`,このフィルタの役割:変数variableの値の頭文字を大文字に変換し、他のアルファベットを小文字に変換する
  • jinja 2では、フィルタはチェーン呼び出しをサポートできます.例は次のとおりです.
    {{ "hello world" | reverse | upper }}
    

    一般的な内蔵フィルタ
    文字列アクション
  • safe:エスケープ無効(ラベルが文字列に変換されないように)
  • <p>{{ 'hello' | safe }}</p>
    
  • capitalize:変数値の頭文字を大文字に、残りの文字を小文字に
  • <p>{{ 'hello' | capitalize }}</p>
    
  • lower:値を小文字に変換
  • <p>{{ 'HELLO' | lower }}</p>
    
  • upper:値を大文字
  • に変換
    <p>{{ 'hello' | upper }}</p>
    
  • title:値の各単語の頭文字を大文字
  • に変換
    <p>{{ 'hello' | title }}</p>
    
  • reverse:文字列反転
  • <p>{{ 'olleh' | reverse }}</p>
    
  • format:フォーマット出力
  • <p>{{ '%s is %d' | format('name',17) }}</p>
    
  • striptags:レンダリング前に値のすべてのHTMLラベルを
  • 削除
    <p>{{ 'hello' | striptags }}</p>
    
  • truncate:文字列遮断
  • <p>{{ 'hello every one' | truncate(9)}}</p>
    

    リストアクション
  • first:最初の要素
  • を取得
    <p>{{ [1,2,3,4,5,6] | first }}</p>
    
  • last:最後の要素
  • を取ります
    <p>{{ [1,2,3,4,5,6] | last }}</p>
    
  • length:取得リスト長
  • <p>{{ [1,2,3,4,5,6] | length }}</p>
    
  • sum:リスト合計
  • <p>{{ [1,2,3,4,5,6] | sum }}</p>
    
  • sort:リストソート
  • {{ [6,2,3,1,5,4] | sort }}


    ステートメントブロックフィルタ
    {% filter upper %}
        #     #
    {% endfilter %}
    

    カスタムフィルタ
    フィルタの本質は関数です.テンプレートに組み込まれているフィルタが需要を満たすことができない場合は、フィルタをカスタマイズできます.カスタムフィルタには、次の2つの方法があります.
  • オブジェクトをFlaskで適用するadd_template_filterメソッド
  • デコレーションによりカスタムフィルタ
  • を実現する.
    重要:カスタムフィルタ名内蔵フィルタと重複すると、内蔵フィルタが上書きされます.
    需要:リスト反転フィルタを追加
    方式一
    アプリケーションインスタンスのadd_を呼び出すtemplate_filterメソッドは、カスタムフィルタを実装します.このメソッドの最初のパラメータは関数名で、2番目のパラメータはカスタムフィルタ名です.
    def do_listreverse(li):
        #             
        temp_li = list(li)
        #         
        temp_li.reverse()
        return temp_li
    
    app.add_template_filter(do_listreverse,'lireverse')
    

    方式2
    デコレーションでカスタムフィルタを実現します.モディファイヤが入力するパラメータは、カスタムフィルタ名です.
    @app.template_filter('lireverse')
    def do_listreverse(li):
        #             
        temp_li = list(li)
        #         
        temp_li.reverse()
        return temp_li
    
  • htmlでこのカスタムフィルタ
  • を使用する.
    <br/> my_array    :{{ my_array }}
    <br/> my_array   :{{ my_array | lireverse }}
    
  • 運転結果
  • my_array    :[3, 4, 2, 1, 7, 9] 
    my_array   :[9, 7, 1, 2, 4, 3]
    
    
    

    テンプレートの継承
    テンプレートでは、次の場合があります.
  • の複数のテンプレートは、完全に同じ上部および下部コンテンツ
  • を有する.
  • 複数のテンプレートには同じテンプレートコードの内容があるが、コンテンツの一部の値は異なる
  • .
  • 複数のテンプレートにおいて全く同じhtmlコードブロックの内容を有する
  • .
    このような場合は、JinJa 2テンプレートの継承を使用して実現できます.
    テンプレート継承は、テンプレート内の共通コンテンツを再利用するためです.一般的なWeb開発では,継承は主にウェブサイトの上部メニュー,下部に用いられる.これらの内容は、繰り返し書く必要がなく、親テンプレートでサブテンプレートが直接継承されるように定義できます.
  • タグ定義の内容
  • {% block top %} {% endblock %}
    
  • は、親テンプレートに穴を掘ることに相当し、子テンプレートが親テンプレートを継承すると、充填できます.
  • サブテンプレートextendsコマンドを使用して、このテンプレートがどのテンプレート
  • から継承されているかを宣言します.
  • 親テンプレートで定義するブロックは、サブテンプレートで再定義され、サブテンプレートで親テンプレートを呼び出す内容はsuper()
  • を使用することができる.
    親テンプレートコード:
    base.html
    {% block top %}
          
    {% endblock top %}
    
    {% block content %}
    {% endblock content %}
    
    {% block bottom %}
        
    {% endblock bottom %}
    

    サブテンプレートコード:
  • extends命令このテンプレートがどの
  • から継承されているかを宣言する
    {% extends 'base.html' %}
    {% block content %}
            
    {% endblock content %}
    

    テンプレート継承使用時の注意点:
  • マルチ継承
  • はサポートされていません.
  • 読みやすいようにサブテンプレートでextendsを使用する場合は、できるだけテンプレートの最初の行に書きます.
  • 同じ名前のblockラベルを1つのテンプレートファイルで複数定義することはできません.
  • ページで複数のblockラベルを使用する場合は、終了ラベルに名前を付けることをお勧めします.複数のblockがネストされている場合は、より読みやすいです.