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()関数はさまざまな方法で使用できます。
いくつかのオブジェクトを渡すことによって; そのオブジェクトの get_absolute_url()メソッドが呼び出され、リダイレクトURLがわかります。
from django.shortcuts import redirect def my_view(request): ... obj = MyModel.objects.get(...) return redirect(obj)
ビューの名前と、オプションでいくつかの位置引数またはキーワード引数を渡すことによって。 URLは、 reverse()メソッドを使用して逆解決されます。
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()
- 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
- リストを取得する Model 、 Manager 、または 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.")