ショートカット関数

revision-up-to:17812 (1.4)

django.shotcuts パッケージでは、MVC の複数のレベルを「橋渡し」するため のヘルパ関数やクラスを定義しています。言い換えると、これらの関数やクラスは、 利便性を実現するために、きちんと制御された形でのカップリングを行えるように しているのです。

render

render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])
Django 1.3 で新たに登場しました: リリースノートを参照してください

与えられたテンプレートとコンテキスト辞書を結合し HttpResponse オブジェクトをレンダされたテキストと ともに返します。

render()render_to_response()context_instance 引数に、使用させる RequestContext を渡した場 合と同じ動作をします。

必須の引数

request
レスポンスを生成する時に使われるリクエストオブジェクト。
template
テンプレートの完全名か、テンプレート名のシーケンス。

省略可能な引数

dictionary
テンプレートコンテキストに追加したい値の入った辞書です。デフォルトでは、 この引数は空の辞書です。辞書の値が呼出可能オブジェクトである場合、ビュー はテンプレートをレンダするの直前にこの値を呼び出します。
context_instance
テンプレートをレンダする時に使われるコンテキストインスタンス。デフォル トではテンプレートは RequestContext インスタンス (requestdictionary の値が入っています) によってレンダリングされます。
content_type
レンダ結果のドキュメントに対して指定する MIME タイプです。デフォルトの 値として、 DEFAULT_CONTENT_TYPE を使います。
status
レスポンスのステータスコード。デフォルトは 200
current_app
現在のビューを含むアプリケーションを示すヒント。詳しくは 名前空間による URL 解決の戦略 を参照してください。

次の例は myapp/index.html テンプレートをレンダし、 MIMETYPE に 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 RequestContext, loader

def my_view(request):
    # View code here...
    t = loader.get_template('myapp/template.html')
    c = RequestContext(request, {'foo': 'bar'})
    return HttpResponse(t.render(c),
        content_type="application/xhtml+xml")

render_to_response

render_to_response(template_name[, dictionary][, context_instance][, mimetype])

引数に指定したテンプレートとコンテキストを使ってテンプレートをレンダし、 レンダ結果のテキストの入った HttpResponse オブジェ クトを返します。

必須の引数

template
利用したいテンプレートの名前、またはテンプレート名のシーケンスです。 もしシーケンスが与えられると、存在する最初のテンプレートを使います。 テンプレートローダードキュメント に、どのようにしてテンプレートを見つけるかの詳しい情報があります。

省略可能な引数

dictionary
テンプレートコンテキストに追加したい値の入った辞書です。デフォルトでは、 この引数は空の辞書です。辞書の値が呼出可能オブジェクトである場合、ビュー はテンプレートをレンダするの直前にこの値を呼び出します。
context_instance

テンプレートをレンダするときに使うコンテキストインスタンスです。デフォ ルトでは、テンプレートは (dictionary の値が入った) Context インスタンスを使ってレンダされます。 コンテキストプロセッサ を使 いたい場合には、例えば以下のように RequestContext を使ってテンプレートをレンダし てください:

return render_to_response('my_template.html',
                          my_data_dictionary,
                          context_instance=RequestContext(request))
mimetype
Django 1.0 で新たに登場しました: リリースノートを参照してください

レンダ結果のドキュメントに対して指定する MIME タイプです。デフォルトの 値として、 DEFAULT_CONTENT_TYPE を使います。

使用例

以下の例では、 myapp/index.html を MIME タイプ application/xhtml+xml でレンダしています:

from django.shortcuts import render_to_response

def my_view(request):
    # View code here...
    return render_to_response('myapp/index.html', {"foo": "bar"},
        mimetype="application/xhtml+xml")

上の例は、以下の例と等価です:

from django.http import HttpResponse
from django.template import Context, loader

def my_view(request):
    # View code here...
    t = loader.get_template('myapp/template.html')
    c = Context({'foo': 'bar'})
    r = HttpResponse(t.render(c),
        mimetype="application/xhtml+xml")

redirect

redirect(to, [permanent=False, ]*args, **kwargs)
Django 1.1 で新たに登場しました: リリースノートを参照してください

引数として渡された適切な URL への HttpResponseRedirect を返します。

引数には以下を取れます:

  • モデル: 渡されたモデルの get_absolute_url() 関数が呼ばれます。
  • urlresolvers.reverse() の引数としてリバース解決に使うことができる ビュー名。
  • リダイレクトのロケーションとなる URL

デフォルトでは一時的リダイレクトを発行します。 permanent=True を渡すと永続的なリダイレクトを発行します。

redirect() 関数は複数の方法で使えます。

  1. オブジェクトを渡す; 渡したオブジェクトの get_absolute_url() が呼ばれます:

    def my_view(request):
        ...
        object = MyModel.objects.get(...)
        return redirect(object)
    
  2. ビューの名前を渡す。ポジション引数やキーワード引数を渡すこともできます。 URL は reverse() method:: によって リバース参照されます:

    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('http://example.com/')
    

デフォルトでは redirect() は一時的リダイレクトを返します。上に書いた 形式のいずれも permanent 引数を取ることができます。 True に セットされ ると永続的なリダイレクトを返します。

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

get_object_or_404

get_object_or_404(klass, *args, **kwargs)

指定したモデルマネジャに対して get() を呼出します。ただし、マネジャがモデルの DoesNotExist を送出した場合には、 django.http.Http404 を送出します。

必須の引数

klass
オブジェクトの取得対象である、 Model, Manager または QuerySet インスタンスです。
**kwargs
検索パラメタです。 get()filter() と同じ引数を使えます。

使用例

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

from django.shortcuts import get_object_or_404

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

この例は、以下の例と等価です:

from django.http import Http404

def my_view(request):
    try:
        my_object = MyModel.objects.get(pk=1)
    except MyModel.DoesNotExist:
        raise Http404

注意: get() と同様、オブジェクトが複数見つかった場合には、 MultipleObjectsReturned 例外が送出されます。

get_list_or_404

get_list_or_404(klass, *args, **kwargs)

指定したモデルマネジャに対して filter() を呼び出した結果を返しま す。戻り値のリストが空なら、 django.http.Http404 を送出します。

必須の引数

klass
オブジェクトの取得対象である、 Model, Manager または QuerySet インスタンスです。
**kwargs
検索パラメタです。 get()filter() と同じ引数を使えます。

使用例

以下の例では、 MyModel から published=True のオブジェクトを全て取得して います:

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 = MyModel.objects.filter(published=True)
    if not my_objects:
        raise Http404