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() 関数の使い方はいくつかあります。

  1. オブジェクトを渡すことで、そのオブジェクトの get_absolute_url() メソッドが呼び出され、リダイレクト URL を返します:

    from django.shortcuts import redirect
    
    
    def my_view(request):
        ...
        obj = MyModel.objects.get(...)
        return redirect(obj)
    
  2. ビューの名前と、オプションで位置引数またはキーワード引数を渡すことで、 reverse() メソッドを使って URL を逆引きできます:

    def my_view(request):
        ...
        return redirect("some-view-name", foo="bar")
    
  3. リダイレクト先としてハードコーディングされた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 例外を発生させます。

引数

klass
オブジェクトを取得するための Model クラス、 Manager または QuerySet インスタンスです。
*args
Q オブジェクト
**kwargs
ルックアップパラメータ。 get() および filter() が受入可能なフォーマットにします。

カスタマイズ例

以下の例では 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 例外が発生します。

Changed in Django 5.0:

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 を発生させます。

引数

klass
リストを取得するための Model, Manager または QuerySet インスタンスです。
*args
Q オブジェクト
**kwargs
ルックアップパラメータ。 get() および filter() が受入可能なフォーマットにします。

カスタマイズ例

以下の例では 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.")
Changed in Django 5.0:

aget_list_or_404() 関数が追加されました。

Back to Top