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 TemplateResponse because the constructor of TemplateResponse offers the same level of convenience as render().

必須の引数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 でレンダリングしてみます。

Code
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",
    )

この例は次のコードと等価です。

Code
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 ステータスコード

True

False

301

False

False

302

False

True

307

True

True

308

An optional max_length keyword argument can be provided to override the maximum allowed length for the redirect URL. Set it to None to disable the length check.

Link to this heading

redirect() 関数の使い方はいくつかあります。

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

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

    Code
    def my_view(request):
        ...
        return redirect("some-view-name", foo="bar")
    
  3. リダイレクト先としてハードコーディングされたURLを渡せます:

    Code
    def my_view(request):
        ...
        return redirect("/some/url/")
    

    これは完全なURLでも機能します:

    Code
    def my_view(request):
        ...
        return redirect("https://example.com/")
    

デフォルトでは redirect() は一時的なリダイレクトを返します。上記のすべての形式で permanent 引数が使えます。 True に設定された場合、恒久的なリダイレクトを返します:

Code
def my_view(request):
    ...
    obj = MyModel.objects.get(...)
    return redirect(obj, permanent=True)

さらに、 preserve_request 引数を使えば、元の HTTP メソッドを保持できます:

Code
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 to argument into a concrete URL. The parameter to may 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 *args and **kwargs, in which case reverse() 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

  1. Resolving a URL for a model that defines get_absolute_url():

    models.py
    Python
    from 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.py
    Python
    from 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),
            }
        )
    
  2. Resolving a target URL for use outside of a redirect, such as in an HTTP response header:

    Code
    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 raises Http404 instead of the model's DoesNotExist exception.

引数Link to this heading

klass

オブジェクトを取得するための Model クラス、 Manager または QuerySet インスタンスです。

*args

Q() オブジェクト.

**kwargs

ルックアップパラメータ。 get() および filter() が受入可能なフォーマットにします。

カスタマイズ例Link to this heading

以下の例では MyModel から主キーが 1 のオブジェクトを取得しています:

Code
from django.shortcuts import get_object_or_404


def my_view(request):
    obj = get_object_or_404(MyModel, pk=1)

この例は次のコードと等価です。

Code
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 インスタンスを渡すこともできます:

Code
queryset = Book.objects.filter(title__startswith="M")
get_object_or_404(queryset, pk=1)

上の例は下記と等価なので、少し不自然ではあります:

Code
get_object_or_404(Book, title__startswith="M", pk=1)

しかし、他の場所から QuerySet 変数を渡された場合には便利です。

最後に、 Manager を使うこともできます。これは例えば カスタムマネージャ がある場合に便利です:

Code
get_object_or_404(Book.dahl_objects, title="Matilda")

関係マネージャ を使うこともできます:

Code
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, raising Http404 if the resulting list is empty.

引数Link to this heading

klass

リストを取得するための Model, Manager または QuerySet インスタンスです。

*args

Q() オブジェクト.

**kwargs

ルックアップパラメータ。 get() および filter() が受入可能なフォーマットにします。

カスタマイズ例Link to this heading

以下の例では MyModel から全ての公開されたオブジェクトを取得しています:

Code
from django.shortcuts import get_list_or_404


def my_view(request):
    my_objects = get_list_or_404(MyModel, published=True)

この例は次のコードと等価です。

Code
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.")