MeWrite Docs

jinja2.exceptions.UndefinedError

Jinja2テンプレートで未定義の変数を使用した場合に発生

概要

UndefinedErrorは、Jinja2テンプレートで定義されていない変数にアクセスした場合に発生するエラーです。

エラーメッセージ

jinja2.exceptions.UndefinedError: 'user' is undefined

原因

  1. 変数が渡されていない: render_templateで変数を渡し忘れ
  2. 変数名のタイプミス: テンプレートでのスペルミス
  3. スコープの問題: ループ外で変数を参照
  4. 条件分岐での未定義: 条件によって変数が存在しない

解決策

1. render_templateで変数を渡す

1
2
3
4
5
# 悪い例
return render_template('index.html')

# 良い例
return render_template('index.html', user=current_user)

2. デフォルト値を設定

1
2
3
4
5
<!-- Jinja2テンプレート -->
{{ user.name | default('ゲスト') }}

<!-- 空文字列もデフォルトにする場合 -->
{{ user.name | default('ゲスト', true) }}

3. 存在確認してから使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{% if user %}
  <p>{{ user.name }}</p>
{% else %}
  <p>ログインしてください</p>
{% endif %}

<!-- または -->
{% if user is defined %}
  {{ user.name }}
{% endif %}

4. コンテキストプロセッサを使用

1
2
3
4
5
6
@app.context_processor
def inject_globals():
    return {
        'site_name': 'My Site',
        'current_year': datetime.now().year
    }

5. undefinedの設定を変更

1
2
3
4
5
6
7
8
from jinja2 import Environment, select_autoescape, Undefined

# 未定義を空文字にする
app.jinja_env.undefined = Undefined

# または警告だけ出す
from jinja2 import make_logging_undefined
app.jinja_env.undefined = make_logging_undefined(logger)

6. getattr/getメソッドを使用

1
2
3
4
5
<!-- オブジェクトのプロパティ -->
{{ user.get('name', 'Unknown') }}

<!-- 辞書の場合 -->
{{ data.get('key', 'default') }}

Flask の他のエラー

最終更新: 2025-12-09