| この記事の要点 |
|
render と redirect の違い
Django の View から画面を表示する方法は、大きく分けて 2 つあります。名前が似ていますが役割はまったく違うので、最初に整理しておきます。
| 関数 | 何をするか | ブラウザの URL | 主な用途 |
|---|---|---|---|
render() | テンプレートに値を埋め込んだ HTML をその場で返す | 変わらない | 一覧・詳細・フォームの表示 |
redirect() | 「この URL に移動して」という 302 応答を返す | 移動先に変わる | 登録・更新・ログイン後の画面移動 |
HttpResponse() | 文字列をそのまま返す | 変わらない | 動作確認、簡単なテキスト応答 |
パラメータなしでテンプレートを表示する
最もシンプルな形です。render は django.shortcuts からインポートします。
from django.shortcuts import render
def index(request):
return render(request, 'index.html')
第 2 引数のテンプレート名は、設定されたテンプレートディレクトリからの相対パスです。アプリ内の templates フォルダに置く場合は、myapp/templates/myapp/index.html のようにアプリ名のフォルダを 1 段挟み、render(request, 'myapp/index.html') と書くのが定石です。別のアプリに同名の index.html があっても取り違えずに済みます。
パラメータありでテンプレートを表示する
テンプレートに値を渡すには、第 3 引数に辞書(context)を渡します。
from django.shortcuts import render
def index(request):
item_list = ['a', 'b', 'c']
context = {
'item_list': item_list,
}
return render(request, 'index.html', context)
テンプレート側では、辞書のキー名で値を参照します。リストは {% for %} で繰り返し表示できます。
<ul>
{% for item in item_list %}
<li>{{ item }}</li>
{% empty %}
<li>データがありません</li>
{% endfor %}
</ul>
モデルから取得したデータも同じように渡せます。context = {'users': User.objects.all()} としておけば、テンプレートで {{ user.name }} のように属性を参照できます。なお、テンプレートに出力した値は自動で HTML エスケープされます。
リダイレクトする
redirect() はテンプレートを表示するのではなく、別の URL へ移動させる関数です。引数には、urls.py で付けた URL 名、URL のパス、またはモデルのインスタンスを渡せます。
from django.shortcuts import redirect
def index(request):
# urls.py で name='top' を付けたパスへ移動
return redirect('top')
def go_home(request):
# パスを直接書くこともできる
return redirect('/')
def after_save(request, pk):
# URL にパラメータが必要な場合はキーワード引数で渡す
return redirect('item_detail', pk=pk)
redirect('index.html') のようにテンプレート名を渡すのはよくある間違いです。この場合 Django は index.html という URL 名を探し、見つからなければ相対 URL として扱うため、意図しないパスに移動して 404 になります。テンプレートを表示したいなら render を使い、移動したいなら URL 名を渡します。
リダイレクト先に値を渡したい場合は、URL のパラメータに含めるか、クエリ文字列を付けるか、一時的な通知ならメッセージフレームワーク(django.contrib.messages)を使います。render のように辞書を直接渡すことはできません。
フォーム送信後は redirect する(PRG パターン)
POST でデータを登録した後に render で完了画面を返すと、ユーザーがブラウザを再読み込みしたときに同じ POST が再送され、二重登録になります。登録処理の後は redirect で別の URL に移動させ、移動先を GET で表示するのが定石です(Post/Redirect/Get パターン)。
from django.shortcuts import render, redirect
def item_create(request):
if request.method == 'POST':
name = request.POST.get('name', '')
# ...保存処理...
return redirect('item_list')
return render(request, 'myapp/item_form.html')
うまく表示されないときの確認ポイント
- TemplateDoesNotExist: テンプレートの置き場所と名前を確認します。アプリ内の
templatesを使うならsettings.pyのTEMPLATESで'APP_DIRS': True、プロジェクト直下のtemplatesを使うなら'DIRS'にパスを登録し、アプリがINSTALLED_APPSに入っているかも確認します。エラー画面の「Template-loader postmortem」に、探したパスが一覧表示されます - NoReverseMatch: redirect に渡した URL 名が
urls.pyのnameと一致していない、または必要なパラメータが足りません。アプリにapp_nameを付けている場合は'myapp:item_list'のように名前空間付きで指定します - 値が表示されない: context のキー名とテンプレートの変数名が一致しているか確認します。存在しない変数はエラーにならず空文字として表示されるため、気づきにくい点に注意します
関連
- Django のリダイレクト|redirect() と PRG パターン・301 の注意
- Django settings.pyのTEMPLATES設定|DIRS・APP_DIRS・context_processors
- Django の URL ディスパッチャー徹底解説(urls.py / path / re_path / include / name)
- djangoでGETとPOSTパラメータ受け取る方法
- Django Context Processor 完全ガイド(全テンプレに共通変数を注入)
子ページはありません
- ビュー(View)
- テンプレート(Template)
- モデル(Model)
- ルーティングの作成
- viewからtemplateへの遷移方法
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスのソフト一覧|Blender・Metasequoiaと用途別の選び方
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- Visual Studio「デザイナーを表示できません」エラーの原因と対処 2026-10-28 12:06:00
- SSH 認証に失敗しました。再試行してください の対処 2026-10-28 12:06:00
- SSH2 秘密鍵の読み込みに失敗しました の原因と対処 2026-10-28 12:06:00
- TeraTerm のよくあるエラーと対処法完全ガイド — Connection refused / 2026-10-28 12:06:00
- Visual Studio エラー一覧|コンパイルエラー・警告の確認方法と対処 2026-10-28 11:39:57
- Whitelabel Error Page の原因と消し方|Spring Boot のエラーページ 2026-10-28 11:39:57
- Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法 2026-10-28 11:39:57
- SQL WHERE 句完全ガイド 2026-10-28 11:39:57
- SQL JOIN 完全ガイド (INNER/LEFT/RIGHT/FULL OUTER) 2026-10-28 11:39:57
- tomcat の起動 / 停止ログと catalina.log・catalina.out の違い 2026-10-28 10:24:23
- Tomcat の起動確認方法 5 つ|localhost:8080・ポート・プロセス・ログ 2026-10-28 10:24:23
- Oracle 19c COMMITの使い方: 暗黙コミット・自動確定・応答不明時の確認 2026-10-28 09:59:09
- Oracle 19c DELETE文|削除対象の確認・COMMIT前の判断・ROLLBACKの条件 2026-10-28 09:59:09
- Oracle 19c INSERT文|INSERT ALL・SELECT・RETURNINGとMERGEの使い分け 2026-10-28 09:59:09
- Oracle 19cのトランザクション制御|COMMIT・ROLLBACK・分離レベルと接続設定 2026-10-28 09:59:09