Django のショートカット関数Link to this heading
django.shortcuts パッケージは、MVC の複数のレベルにまたがるヘルパー関数とクラスを集めたものです。言い換えれば、これらの関数やクラスは、便宜上、控えめな結合を取り入れます。
render()Link to this heading
- render(request, template_name, context=None, content_type=None, status=None, using=None)Link to this definition
与えられたテンプレートとコンテキスト辞書を組み合わせてレンダリングされたテキストを持つ、
HttpResponseオブジェクトを返します。Django does not provide a shortcut function which returns a
TemplateResponsebecause the constructor ofTemplateResponseoffers the same level of convenience asrender().
必須の引数Link to this heading
requestこのレスポンスを生成するのに使用されるリクエスト オブジェクト。
template_name使用するテンプレートの完全な名前、または、テンプレート名のシーケンス。シーケンスが指定された場合、最初に存在するテンプレートが使用されます。テンプレートの検索方法については、テンプレートの読み込みドキュメント を参照してください。
オプションの引数Link to this heading
contextテンプレートコンテキストに追加する値の辞書です。デフォルトでは空の辞書です。辞書内の値が呼び出し可能な場合、ビューはテンプレートをレンダリングする直前にそれを呼び出します。
content_type結果のドキュメントに適用するMIMEタイプ。デフォルトは
'text/html'です。statusレスポンスのステータスコード。デフォルトは
200です。usingテンプレートを読み込むために使用するテンプレートエンジンの
NAMEを指定します。
カスタマイズ例Link to this heading
次の例では、テンプレート 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()Link to this heading
- redirect(to, *args, permanent=False, preserve_request=False, max_length=MAX_URL_REDIRECT_LENGTH, **kwargs)Link to this definition
渡された引数に対して、 適切な 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 ステータスコード
TrueFalse301
FalseFalse302
FalseTrue307
TrueTrue308
An optional
max_lengthkeyword argument can be provided to override the maximum allowed length for the redirect URL. Set it toNoneto disable the length check.
例Link to this heading
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)
# ...
resolve_url()Link to this heading
- resolve_url(to, *args, **kwargs)Link to this definition
Returns a URL string by resolving and normalizing the given
toargument into a concrete URL. The parametertomay be:An object implementing
get_absolute_url(), in which case the method will be called and its result returned.A view name, view function, or view class, possibly with arguments passed as
*argsand**kwargs, in which casereverse()will be used to reverse-resolve the view.A URL string, which will be returned unchanged.
This function is used internally by the
redirect()shortcut to determine the target URL for the redirect location.
例Link to this heading
Resolving a URL for a model that defines
get_absolute_url():models.pyfrom django.db import models from django.urls import reverse class Article(models.Model): title = models.CharField(max_length=100) def get_absolute_url(self): return reverse("article-detail", args=[self.pk])views.pyfrom django.http import JsonResponse from django.shortcuts import get_object_or_404, resolve_url from .models import Article def article_api_view(request, pk): """Return metadata about an article, including its canonical URL.""" article = get_object_or_404(Article, pk=pk) return JsonResponse( { "id": article.pk, "title": article.title, "url": resolve_url(article), } )Resolving a target URL for use outside of a redirect, such as in an HTTP response header:
from django.conf import settings from django.http import HttpResponse from django.shortcuts import resolve_url def login_success(request): response = HttpResponse("Login successful") response["X-Next-URL"] = resolve_url(settings.LOGIN_REDIRECT_URL) return response
get_object_or_404()Link to this heading
- get_object_or_404(klass, *args, **kwargs)Link to this definition
- aget_object_or_404(klass, *args, **kwargs)Link to this definition
非同期バージョン:
aget_object_or_404()Calls
get()on a given model manager, but it raisesHttp404instead of the model'sDoesNotExistexception.
引数Link to this heading
klass*args**kwargsルックアップパラメータ。
get()およびfilter()が受入可能なフォーマットにします。
カスタマイズ例Link to this heading
以下の例では 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()Link to this heading
- get_list_or_404(klass, *args, **kwargs)Link to this definition
- aget_list_or_404(klass, *args, **kwargs)Link to this definition
非同期バージョン:
aget_list_or_404()Returns the result of
filter()on a given model manager cast to a list, raisingHttp404if the resulting list is empty.
引数Link to this heading
klass*args**kwargsルックアップパラメータ。
get()およびfilter()が受入可能なフォーマットにします。
カスタマイズ例Link to this heading
以下の例では 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.")