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()¶
- 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()¶
- 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() 関数が追加されました。
 
          