| この記事の要点 |
|
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 / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38