Djangoショートカット関数—Djangoドキュメント

提供:Dev Guides
< DjangoDjango/docs/3.2.x/topics/http/shortcuts
移動先:案内検索

Djangoショートカット関数

パッケージdjango.shortcutsは、MVCの複数のレベルに「またがる」ヘルパー関数とクラスを収集します。 言い換えると、これらの関数/クラスは、便宜上、制御された結合を導入します。

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)

指定されたテンプレートを指定されたコンテキストディクショナリと組み合わせて、 HttpResponse オブジェクトとそのレンダリングされたテキストを返します。

TemplateResponse のコンストラクターは、 render()と同じレベルの利便性を提供するため、Djangoは TemplateResponse を返すショートカット関数を提供していません。

必須の引数

request
この応答を生成するために使用される要求オブジェクト。
template_name
使用するテンプレートのフルネームまたはテンプレート名のシーケンス。 シーケンスが指定されている場合、存在する最初のテンプレートが使用されます。 テンプレートの検索方法の詳細については、テンプレート読み込みドキュメントを参照してください。


オプションの引数

context
テンプレートコンテキストに追加する値のディクショナリ。 デフォルトでは、これは空の辞書です。 ディクショナリの値が呼び出し可能である場合、ビューはテンプレートをレンダリングする直前にそれを呼び出します。
content_type
結果のドキュメントに使用するMIMEタイプ。 デフォルトは'text/html'です。
status
応答のステータスコード。 デフォルトは200です。
using
NS :setting: `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. ビューの名前と、オプションでいくつかの位置引数またはキーワード引数を渡すことによって。 URLは、 reverse()メソッドを使用して逆解決されます。

    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)
特定のモデルマネージャーで get()を呼び出しますが、モデルの DoesNotExist 例外の代わりに Http404 を発生させます。

必須の引数

klass
オブジェクトを取得する Model クラス、 Manager 、または QuerySet インスタンス。
**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 例外が発生します。


get_list_or_404()

get_list_or_404(klass, *args, **kwargs)
リストにキャストされた特定のモデルマネージャーでの filter()の結果を返し、結果のリストが空の場合は Http404 を発生させます。

必須の引数

klass
リストを取得する ModelManager 、または QuerySet インスタンス。
**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.")