django.shortcuts パッケージは、MVC の複数のレベルにまたがるヘルパー関数とクラスを集めたものです。言い換えれば、これらの関数やクラスは、便宜上、控えめな結合を取り入れます。
render()¶与えられたテンプレートとコンテキスト辞書を組み合わせてレンダリングされたテキストを持つ、 HttpResponse オブジェクトを返します。
Django does not provide a shortcut function which returns a
TemplateResponse because the constructor
of TemplateResponse offers the same level
of convenience as render().
requestこのレスポンスを生成するのに使用されるリクエスト オブジェクト。
template_name使用するテンプレートの完全な名前、または、テンプレート名のシーケンス。シーケンスが指定された場合、最初に存在するテンプレートが使用されます。テンプレートの検索方法については、テンプレートの読み込みドキュメント を参照してください。
contextテンプレートコンテキストに追加する値の辞書です。デフォルトでは空の辞書です。辞書内の値が呼び出し可能な場合、ビューはテンプレートをレンダリングする直前にそれを呼び出します。
content_type結果のドキュメントに適用するMIMEタイプ。デフォルトは 'text/html' です。
statusレスポンスのステータスコード。デフォルトは 200 です。
usingテンプレートを読み込むために使用するテンプレートエンジンの NAME を指定します。
次の例では、テンプレート myapp/index.html をMIMEタイプ application/xhtml+xml でレンダリングしてみます。
from django.shortcuts import render
def my_view(request):
# View code here...
return render(
request,
"myapp/index.html",
{
"foo": "bar",
},
content_type="application/xhtml+xml",
)
この例は次のコードと等価です。
from django.http import HttpResponse
from django.template import loader
def my_view(request):
# View code here...
t = loader.get_template("myapp/index.html")
c = {"foo": "bar"}
return HttpResponse(t.render(c, request), content_type="application/xhtml+xml")
redirect()¶渡された引数に対して、 適切な URLへの HttpResponseRedirect を返します。
引数には以下が含まれます:
A model: the model's get_absolute_url()
function will be called.
ビュー名(引数を渡せます): reverse() を使って名前を逆解決します。
絶対URLまたは相対URL。これはそのままリダイレクト先になります。
デフォルトではステータスコード 302 の一時リダイレクトが発行されます。 permanent=True を指定すると、ステータスコード 301 の恒久リダイレクトが発行されます。
preserve_request=True を指定すると、レスポンスはリダイレクト時に元のリクエストのメソッドやボディを保持するようユーザーエージェントに指示します。この場合、一時リダイレクトにはステータスコード 307 が、恒久リダイレクトにはステータスコード 308 が使用されます。次の表のほうがわかりやすいでしょう:
permanent |
preserve_request |
HTTP ステータスコード |
|---|---|---|
|
|
301 |
|
|
302 |
|
|
307 |
|
|
308 |
preserve_request 引数が追加されました。
redirect() 関数の使い方はいくつかあります。
オブジェクトを渡すことで、そのオブジェクトの get_absolute_url() メソッドが呼び出され、リダイレクト URL を返します:
from django.shortcuts import redirect
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj)
ビューの名前と、オプションで位置引数またはキーワード引数を渡すことで、 reverse() メソッドを使って URL を逆引きできます:
def my_view(request):
...
return redirect("some-view-name", foo="bar")
リダイレクト先としてハードコーディングされたURLを渡せます:
def my_view(request):
...
return redirect("/some/url/")
これは完全なURLでも機能します:
def my_view(request):
...
return redirect("https://example.com/")
デフォルトでは redirect() は一時的なリダイレクトを返します。上記のすべての形式で permanent 引数が使えます。 True に設定された場合、恒久的なリダイレクトを返します:
def my_view(request):
...
obj = MyModel.objects.get(...)
return redirect(obj, permanent=True)
さらに、 preserve_request 引数を使えば、元の HTTP メソッドを保持できます:
def my_view(request):
# ...
obj = MyModel.objects.get(...)
if request.method in ("POST", "PUT"):
# Redirection preserves the original request method.
return redirect(obj, preserve_request=True)
# ...
get_object_or_404()¶非同期バージョン: aget_object_or_404()
Calls get() on a given model
manager, but it raises Http404 instead of the model's
DoesNotExist exception.
以下の例では MyModel から主キーが 1 のオブジェクトを取得しています:
from django.shortcuts import get_object_or_404
def my_view(request):
obj = get_object_or_404(MyModel, pk=1)
この例は次のコードと等価です。
from django.http import Http404
def my_view(request):
try:
obj = MyModel.objects.get(pk=1)
except MyModel.DoesNotExist:
raise Http404("No MyModel matches the given query.")
最もよくある使用例は、上記のように Model を渡すものです。しかし、 QuerySet インスタンスを渡すこともできます:
queryset = Book.objects.filter(title__startswith="M")
get_object_or_404(queryset, pk=1)
上の例は下記と等価なので、少し不自然ではあります:
get_object_or_404(Book, title__startswith="M", pk=1)
しかし、他の場所から QuerySet 変数を渡された場合には便利です。
最後に、 Manager を使うこともできます。これは例えば カスタムマネージャ がある場合に便利です:
get_object_or_404(Book.dahl_objects, title="Matilda")
関係マネージャ を使うこともできます:
author = Author.objects.get(name="Roald Dahl")
get_object_or_404(author.book_set, title="Matilda")
注意: get() と同様に、複数のオブジェクトが見つかった場合は MultipleObjectsReturned 例外が発生します。
get_list_or_404()¶非同期バージョン: aget_list_or_404()
Returns the result of filter() on
a given model manager cast to a list, raising Http404
if the resulting list is empty.
以下の例では MyModel から全ての公開されたオブジェクトを取得しています:
from django.shortcuts import get_list_or_404
def my_view(request):
my_objects = get_list_or_404(MyModel, published=True)
この例は次のコードと等価です。
from django.http import Http404
def my_view(request):
my_objects = list(MyModel.objects.filter(published=True))
if not my_objects:
raise Http404("No MyModel matches the given query.")
12月 03, 2025