Flask入門|Jinja2の定番フィルターをまとめて習得しよう【チャプター3-02】

ながみえ

一つ前のページではフィルターの基本について学習しました。

今回は 色々なフィルター について見ていきましょう。

Chapter1:Flask入門編
Chapter2:Jinja2入門編
Chapter3:フィルター編

 ・Chapter3-1:フィルターの基本を理解しよう
 ・Chapter3-2:色々なフィルターを使ってみよう ◁今回はここ
 ・Chapter3-3:カスタムフィルターを理解しよう
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:Flaskの便利機能編
Chapter7:アプリ開発編

前回の記事では、「フィルターとは何か」や、「大文字・小文字に変換する基本的なフィルターの使い方」を学びました。

今回はその応用編として、FlaskのテンプレートエンジンJinja2で使えるさまざまな便利なフィルターを紹介していきます。

この章を通じて、テンプレート上でのデータ加工力を一気に高めましょう。

なお、全てのフィルターを記憶する必要はありません。必要に応じて使い方を調べて使用できるようになりましょう。

<<前のページ

Flaskの記事一覧

次のページ>>

Jinja2の便利フィルターまとめ|Webテンプレートをもっと自由に!

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

upper フィルター:すべて大文字に変換

英字をすべて大文字に変換します。

<!-- 基本構文 -->
{{ 変数名 | upper }}

<!-- 使用例 -->
<p>{{ "hello flask" | upper }}</p>  <!-- 出力結果: HELLO FLASK -->

lower フィルター:すべて小文字に変換

英字をすべて小文字に変換します。

<!-- 基本構文 -->
{{ 変数名 | lower }}

<!-- 使用例 -->
<p>{{ "Hello Flask!" | lower }}</p>  <!-- 出力結果: hello flask! -->

title フィルター:単語の先頭を大文字に

各単語の先頭を大文字にします(タイトル形式)。

<!-- 基本構文 -->
{{ 変数名 | title }}

<!-- 使用例 -->
<p>{{ "flask makes web easy" | title }}</p>  <!-- 出力結果: Flask Makes Web Easy -->

replace フィルター:文字列の置換

ある文字列を別の文字列に置き換えます。

<!-- 基本構文 -->
{{ 変数名 | replace("置き換え元", "置き換え先") }}

<!-- 使用例 -->
<p>{{ "I like Django" | replace("Django", "Flask") }}</p>  <!-- 出力結果: I like Flask -->

length フィルター:要素数を数える

文字列やリストなどの長さ(要素数)を返します。

<!-- 基本構文 -->
{{ 変数名 | length }}

<!-- 使用例 -->
<p>{{ [1, 2, 3, 4] | length }}</p>  <!-- 出力結果: 4 -->
<p>{{ "Flask" | length }}</p>       <!-- 出力結果: 5 -->

default フィルター:値が未定義や空のときに代替を表示

変数が未定義・空の場合に代替の値を表示します。

<!-- 基本構文 -->
{{ 変数名 | default("代替値") }}

<!-- 使用例 -->
<p>{{ user_name | default("ゲスト") }}</p>  <!-- user_name が空なら「ゲスト」と表示 -->

safe フィルター:HTMLタグのエスケープを防ぐ

HTMLタグをそのまま出力するようにします。

<!-- 基本構文 -->
{{ 変数名 | safe }}

<!-- 使用例 -->
{% set html_text = "<strong>重要!</strong>" %}
<p>{{ html_text }}</p>        <!-- エスケープされて表示されない -->
<p>{{ html_text | safe }}</p> <!-- タグが有効になり太字で表示される -->

join フィルター:リスト要素を連結

リスト要素を指定した区切り文字で結合します。

<!-- 基本構文 -->
{{ リスト | join("区切り文字") }}

<!-- 使用例 -->
<p>{{ ["Python", "Flask", "Jinja"] | join(", ") }}</p>  <!-- 出力: Python, Flask, Jinja -->

truncate フィルター:文字列を省略表示

長すぎる文字列を省略して表示します。

<!-- 基本構文 -->
{{ 変数名 | truncate(最大文字数) }}

<!-- 使用例 -->
<p>{{ "これは非常に長い文章です。覚悟して読んでください。" | truncate(10) }}</p>
<!-- 出力: これは非常に... -->

フィルターを使えばJinja2テンプレートはもっと便利に!

今回は、Flaskテンプレートでよく使われるJinja2のビルトインフィルターを9つ紹介しました。

フィルターを使えば、HTML側でのデータの表示形式を柔軟に調整できるようになります。

今後Flaskで実践的なアプリを作る際、こうした小さな工夫が見た目や使いやすさを大きく変えてくれるでしょう。

次回は「自作のカスタムフィルター」の作成方法を学び、より高度な処理もできるようにしていきましょう!

練習問題:Jinja2の色々なフィルターを使ってテンプレートを完成させよう

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

Flaskアプリ側から複数のデータをテンプレートに渡し、そのテンプレート内でフィルターを使ってデータの表示形式を整えるWebページを作成してみましょう。

以下にPythonファイルは用意してありますので、templates/show_filters.html テンプレートファイルを作成してください。

完成したWebページでは、ユーザー名の整形、未入力値の代替、HTMLタグの表示、リストの結合、文字列の省略といった処理が確認できます。

この問題の要件

以下の要件に従ってコードを完成させてください。

以下の内容を満たす templates/show_filters.html ファイルを作成すること

  • data.user_name に対して upper フィルターを使用し、全て大文字にして表示すること。
  • data.empty_value に対して default("(未入力)") フィルターを使用して表示すること。
  • data.html_text に対して safe フィルターを使い、HTMLタグをそのまま有効にして表示すること。
  • data.fruits(リスト)に対して join("、") フィルターを使用し、果物の名前を「、」区切りで表示すること。
  • data.long_text に対して truncate(20) フィルターを使用し、長すぎる文字列を省略表示すること。

ただし、Flaskアプリ内で以下のようなPythonコードが実行されることを前提とする。

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/')
def show_filters():
    data = {
        "user_name": "tanaka",
        "empty_value": "",
        "html_text": "<strong>これは重要です</strong>",
        "fruits": ["りんご", "バナナ", "もも"],
        "long_text": "この文章はとても長いので途中で切り捨てられます。"
    }
    return render_template("show_filters.html", data=data)

if __name__ == '__main__':
    app.run(debug=True)

また、以下のような実行結果となるコードを書くこと。

Jinja2フィルターを使って表示を工夫しよう!

ユーザー名(大文字): TANAKA  
入力されていない値: (未入力)  
HTML表示テスト: これは重要です(太字で表示)  
好きな果物: りんご、バナナ、もも  
省略された文章: この文章はとても長い...

正解コード

例えば、以下のようなプログラムが考えられます。

Q
正解コード
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Jinja2フィルターの練習</title>
</head>
<body>
    <h1>Jinja2フィルターを使って表示を工夫しよう!</h1>

    <!-- 大文字変換(upper) -->
    <p>ユーザー名(大文字): {{ data.user_name | upper }}</p> <!-- 結果: TANAKA -->

    <!-- デフォルト値(default) -->
    <p>入力されていない値: {{ data.empty_value | default("(未入力)") }}</p> <!-- 結果: (未入力) -->

    <!-- HTMLタグを有効化(safe) -->
    <p>HTML表示テスト: {{ data.html_text | safe }}</p> <!-- <strong>が反映される -->

    <!-- リストを文字列に変換(join) -->
    <p>好きな果物: {{ data.fruits | join("、") }}</p> <!-- 結果: りんご、バナナ、もも -->

    <!-- 文字列を短く(truncate) -->
    <p>省略された文章: {{ data.long_text | truncate(20) }}</p> <!-- 結果: この文章はとても長い... -->

</body>
</html>

<<前のページ

Flaskの記事一覧

次のページ>>

FAQ|Jinja2フィルターの使い方でよくある疑問

Q
Q1. フィルターはテンプレート内のどの位置で使うのが正しいですか?

フィルターは {{ 変数 | フィルター名 }} のように変数の後にパイプ(|)でつなげて使います。通常はHTMLに表示させる部分で使うことが多いです。

Q
Q2. 複数のフィルターを同じ変数に連続で使うことはできますか?

はい、可能です。たとえば {{ text | lower | truncate(10) }} のように組み合わせて使うことで、より柔軟な表示ができます。

Q
Q3. フィルターを使っても出力が思った通りにならないときは、どこを確認すべきですか?

変数の値が None や空文字になっていないか、使っているフィルターに適切な引数を与えているかを確認してください。特に defaulttruncate では初期値や桁数の指定が重要です。

質問用コンタクトフォーム

この記事を書くにあたりAIを活用しています。

人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。

記事URLをコピーしました