Flask入門|テンプレートの条件分岐を使った表示制御の基本【チャプター2-06】

一つ前のページではテンプレートと繰り返し処理について学習しました。
今回は テンプレートと分岐処理 について見ていきましょう。
Chapter1:Flask入門編
Chapter2:Jinja2入門編
・Chapter2-1:Jinja2とは何か|テンプレートエンジン入門
・Chapter2-2:テンプレートの継承を理解しよう
・Chapter2-3:url_for関数を理解しよう
・Chapter2-4:render_template関数を理解しよう
・Chapter2-5:テンプレートと繰り返し処理
・Chapter2-6:テンプレートと分岐処理 ◁今回はここ
Chapter3:フィルター編
Chapter4:フォーム編
Chapter5:データベース編
Chapter6:Flaskの便利機能編
Chapter7:アプリ開発編
Webアプリケーションでは、状況に応じてページの表示内容を変える必要があります。
たとえば「ログインしているときだけマイページへのリンクを表示する」や「エラーが発生したときだけ注意メッセージを出す」といった処理です。
このような表示の制御を行うために、Jinja2テンプレートでは 分岐処理 が使えます。
Pythonのif
文に似ていますが、テンプレート用に少し書き方が異なります。
Flaskテンプレートにおける条件分岐とは?
:条件分岐の役割|HTML表示を動的に切り替える仕組み
分岐処理とは、「ある条件が成立しているかどうかによって処理内容を切り替える仕組み」です。
たとえば「変数score
が80以上なら”合格”と表示し、それ未満なら”不合格”と表示する」などです。
Jinja2テンプレートでは、Pythonのようにコードで処理を切り替えるのではなく、HTMLの表示部分を制御するために分岐処理を使います。
Flaskテンプレートにおける条件分岐の基本構文
Jinja2における分岐処理の基本的な構文は以下のとおりです:
{% if 条件式 %} 条件が真のときに表示される内容 {% elif 別の条件式 %} elifの条件が真のときの内容 {% else %} どの条件も満たさないときの内容 {% endif %} <!-- ここだけはPythonのif文とは違う -->
if
から始まり、必要に応じてelif
やelse
を追加します。- 最後は必ず
{% endif %}
で閉じる必要があります。 elif
とelse
は省略しても構いません。
if文の使用上の注意点と制限事項
- Jinja2の分岐処理はPythonの
if
文によく似ていますが、インデントによるブロック指定が不要です。
代わりに{% if %}
〜{% endif %}
のペアで範囲を明示します。 - Python側で条件を処理してから結果だけ渡すこともできますが、テンプレート側で分岐することでHTMLの柔軟な表示制御が可能になります。
条件分岐の使用例を通じて理解を深めよう
実際に分岐処理を使用した例をふたつ紹介します。
使用例①|変数の値に応じた表示切り替え(if文)
以下の例では、ログインしているかどうかに応じて表示内容を切り替えています。
{% if logged_in %} <p>ようこそ、ログインユーザーさん!</p> {% else %} <p>ログインしてください。</p> {% endif %}
このテンプレートは、Flask側で渡された logged_in
という変数の値を確認し、それが真 (True
) であれば「ようこそ」と表示し、偽 (False
) のときは「ログインしてください」と表示します。
たとえば以下のように render_template()関数
で変数を渡します:
@app.route("/login") def login(): return render_template("login.html", logged_in=True)
この場合は「ようこそ、ログインユーザーさん!」と表示されます。
使用例②|複数条件を持つelifとelseの使い方
次は、score
という変数の値によって表示内容を分ける例です。
{% if score >= 80 %} <p>結果:優秀です!</p> {% elif score >= 60 %} <p>結果:合格です。</p> {% else %} <p>結果:不合格です。</p> {% endif %}
Flaskのルート関数で以下のように使います:
@app.route("/result/<int:score>") def result(score): return render_template("result.html", score=score)
このルートに /result/85
とアクセスすると、score
には85が渡され、「結果:優秀です!」が表示されます。
ポイントは複数の条件を順にチェックできることです。最初の条件が満たされないとき、次のelif
、そしてelse
と順に評価されます。
まとめ
テンプレート内での分岐処理をマスターすることで、状況に応じた柔軟なページ表示が可能になります。
これでテンプレートエンジン「Jinja2」の基本的な使い方──値の埋め込み、テンプレートの継承、ループ、そして分岐──すべてを一通り学び終えました。
Jinja2の基礎を理解できたあなたは、もう立派にFlask開発者への一歩を踏み出しています。
次のチャプターでは、Webアプリに欠かせないフォーム処理に入ります。ここからは「ユーザーが入力したデータをどう扱うか」という、さらに実践的な力が求められます。
この勢いのまま、次のステップへ進みましょう!
練習問題:条件に応じて表示内容を変えるテンプレートを作ろう
今回の問題では、アプリファイル(chapter2-6-1.py)を問題文の中で提示します。
あなたはテンプレートファイル(age_check.html
)を作成し、アプリファイルから渡される年齢に応じて、異なるメッセージが表示されるようにしてください。
この問題の要件
以下の要件に従ってコードを完成させてください。
- テンプレートファイル(
age_check.html
)を作成し、以下の分岐表示を実装 age
が65以上なら「シニア割引の対象です。」と表示age
が20以上65未満なら「大人料金が適用されます。」と表示- それ以外(20未満)の場合は「子供料金が適用されます。」と表示
ただし、Flaskアプリ内で以下のようなPythonコードが実行されることを前提とする。
from flask import Flask, render_template app = Flask(__name__) @app.route("/") def home(): age = 20 # 年齢の値を設定 return render_template("age_check.html", age=age) if __name__ == "__main__": app.run(debug=True)
また、以下のような実行結果となるコードを書くこと。
あなたの年齢に応じた料金 大人料金が適用されます。
正解コード
例えば、以下のようなプログラムが考えられます。
- 正解コード
-
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>年齢による料金案内</title> </head> <body> <h1>あなたの年齢に応じた料金</h1> {# 以下は今回学習したJinja2の条件分岐処理です #} {% if age >= 65 %} <p>シニア割引の対象です。</p> {% elif age >= 20 %} <p>大人料金が適用されます。</p> {% else %} <p>子供料金が適用されます。</p> {% endif %} </body> </html>
FAQ|Flaskテンプレートでの条件分岐の使い方
- Q1. Flaskテンプレートでif文を使っても何も表示されないのはなぜですか?
-
条件式が正しく評価されていない可能性があります。変数に意図した値が渡っているか、Noneや空文字と比較している場合などは注意が必要です。
- Q2. Jinja2のif文で数値や文字列を比較することはできますか?
-
可能です。Pythonの構文と同様に
==
や!=
などの演算子を使って、文字列や数値を比較できます。ただし、テンプレートでは型に注意して比較するのがポイントです。
- Q3. 条件が複数ある場合、テンプレートでどう書けばよいですか?
-
elif
やelse
を使って複数の条件分岐が書けます。複雑なロジックが必要なときは、Python側で処理を分けておき、テンプレートには表示ロジックだけを書くとシンプルになります。
質問用コンタクトフォーム
この記事を書くにあたりAIを活用しています。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。