Django のショートカット関数¶
django.shortcuts
パッケージは、MVC の複数のレベルにまたがるヘルパー関数とクラスを集めたものです。言い換えれば、これらの関数やクラスは、便宜上、控えめな結合を取り入れます。
render()
¶
-
render
(request, template_name, context=None, content_type=None, status=None, using=None)¶ 与えられたテンプレートとコンテキスト辞書を組み合わせてレンダリングされたテキストを持つ、
HttpResponse
オブジェクトを返します。Djangoは、
TemplateResponse
を返すショートカット関数を提供していません。なぜなら、TemplateResponse
のコンストラクタは、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()
¶
-
redirect
(to, *args, permanent=False, **kwargs)¶ 渡された引数に対して、 適切な URLへの
HttpResponseRedirect
を返します。引数には以下が含まれます:
- モデル:モデルの
get_absolute_url()
関数が呼び出されます。 - ビュー名(引数を渡せます):
reverse()
を使って名前を逆解決します。 - 絶対URLまたは相対URL。これはそのままリダイレクト先になります。
デフォルトでは一時的なリダイレクトを発行します。
permanent=True
を渡すと恒久的なリダイレクトを発行します。- モデル:モデルの
例¶
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)
get_object_or_404()
¶
-
get_object_or_404
(klass, *args, **kwargs)¶
-
aget_object_or_404
(klass, *args, **kwargs)¶ 非同期バージョン:
aget_object_or_404()
与えられたモデルマネージャに対して
get()
を呼び出しますが、モデルのDoesNotExist
例外の代わりにHttp404
例外を発生させます。
引数¶
カスタマイズ例¶
以下の例では 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
例外が発生します。
aget_object_or_404()
関数が追加されました。
get_list_or_404()
¶
-
get_list_or_404
(klass, *args, **kwargs)¶
-
aget_list_or_404
(klass, *args, **kwargs)¶ 非同期バージョン:
aget_list_or_404()
与えられたモデルマネージャの
filter()
の結果をリストにキャストして返します。結果のリストが空の場合は、Http404
を発生させます。
引数¶
カスタマイズ例¶
以下の例では 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.")
aget_list_or_404()
関数が追加されました。