=================== ショートカット関数 =================== :revision-up-to: 17812 (1.4) .. module:: django.shortcuts :synopsis: Django MVC スタックの複数レベルを橋渡しする便利なショートカット .. index:: shortcuts ``django.shotcuts`` パッケージでは、MVC の複数のレベルを「橋渡し」するため のヘルパ関数やクラスを定義しています。言い換えると、これらの関数やクラスは、 利便性を実現するために、きちんと制御された形でのカップリングを行えるように しているのです。 ``render`` ========== .. function:: render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app]) .. versionadded:: 1.3 与えられたテンプレートとコンテキスト辞書を結合し :class:`~django.http.HttpResponse` オブジェクトをレンダされたテキストと ともに返します。 :func:`render()` は :func:`render_to_response()` の `context_instance` 引数に、使用させる :class:`~django.template.RequestContext` を渡した場 合と同じ動作をします。 必須の引数 ---------- ``request`` レスポンスを生成する時に使われるリクエストオブジェクト。 ``template`` テンプレートの完全名か、テンプレート名のシーケンス。 省略可能な引数 -------------- ``dictionary`` テンプレートコンテキストに追加したい値の入った辞書です。デフォルトでは、 この引数は空の辞書です。辞書の値が呼出可能オブジェクトである場合、ビュー はテンプレートをレンダするの直前にこの値を呼び出します。 ``context_instance`` テンプレートをレンダする時に使われるコンテキストインスタンス。デフォル トではテンプレートは ``RequestContext`` インスタンス (``request`` と ``dictionary`` の値が入っています) によってレンダリングされます。 ``content_type`` レンダ結果のドキュメントに対して指定する MIME タイプです。デフォルトの 値として、 :setting:`DEFAULT_CONTENT_TYPE` を使います。 ``status`` レスポンスのステータスコード。デフォルトは ``200`` 。 ``current_app`` 現在のビューを含むアプリケーションを示すヒント。詳しくは :ref:`名前空間による URL 解決の戦略 ` を参照してください。 例 -- 次の例は ``myapp/index.html`` テンプレートをレンダし、 MIMETYPE に :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`` ======================== .. function:: render_to_response(template_name[, dictionary][, context_instance][, mimetype]) 引数に指定したテンプレートとコンテキストを使ってテンプレートをレンダし、 レンダ結果のテキストの入った :class:`~django.http.HttpResponse` オブジェ クトを返します。 必須の引数 ----------- ``template`` 利用したいテンプレートの名前、またはテンプレート名のシーケンスです。 もしシーケンスが与えられると、存在する最初のテンプレートを使います。 :ref:`テンプレートローダードキュメント ` に、どのようにしてテンプレートを見つけるかの詳しい情報があります。 省略可能な引数 ---------------- ``dictionary`` テンプレートコンテキストに追加したい値の入った辞書です。デフォルトでは、 この引数は空の辞書です。辞書の値が呼出可能オブジェクトである場合、ビュー はテンプレートをレンダするの直前にこの値を呼び出します。 ``context_instance`` テンプレートをレンダするときに使うコンテキストインスタンスです。デフォ ルトでは、テンプレートは (``dictionary`` の値が入った) :class:`~django.template.Context` インスタンスを使ってレンダされます。 :ref:`コンテキストプロセッサ ` を使 いたい場合には、例えば以下のように :class:`~django.template.RequestContext` を使ってテンプレートをレンダし てください:: return render_to_response('my_template.html', my_data_dictionary, context_instance=RequestContext(request)) ``mimetype`` .. versionadded:: 1.0 レンダ結果のドキュメントに対して指定する MIME タイプです。デフォルトの 値として、 :setting:`DEFAULT_CONTENT_TYPE` を使います。 .. _`context processors`: ../templates_python/#subclassing-context-requestcontext .. _`コンテキストプロセッサ`: `context processors`_ 使用例 ------- 以下の例では、 ``myapp/index.html`` を MIME タイプ :mimetype:`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`` ============ .. function:: redirect(to[, permanent=False], *args, **kwargs) .. versionadded:: 1.1 引数として渡された適切な URL への :class:`~django.http.HttpResponseRedirect` を返します。 引数には以下を取れます: * モデル: 渡されたモデルの `get_absolute_url()` 関数が呼ばれます。 * `urlresolvers.reverse()` の引数としてリバース解決に使うことができる ビュー名。 * リダイレクトのロケーションとなる URL デフォルトでは一時的リダイレクトを発行します。 ``permanent=True`` を渡すと永続的なリダイレクトを発行します。 例 -- :func:`redirect` 関数は複数の方法で使えます。 1. オブジェクトを渡す; 渡したオブジェクトの :meth:`~django.db.models.Model.get_absolute_url` が呼ばれます:: def my_view(request): ... object = MyModel.objects.get(...) return redirect(object) 2. ビューの名前を渡す。ポジション引数やキーワード引数を渡すこともできます。 URL は :func:`~django.core.urlresolvers.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/') デフォルトでは :func:`redirect` は一時的リダイレクトを返します。上に書いた 形式のいずれも ``permanent`` 引数を取ることができます。 True に セットされ ると永続的なリダイレクトを返します。 def my_view(request): ... object = MyModel.objects.get(...) return redirect(object, permanent=True) ``get_object_or_404`` ===================== .. function:: get_object_or_404(klass, *args, **kwargs) 指定したモデルマネジャに対して :meth:`~django.db.models.QuerySet.get()` を呼出します。ただし、マネジャがモデルの :class:`~django.core.excepitons.DoesNotExist` を送出した場合には、 :class:`django.http.Http404` を送出します。 必須の引数 ----------- ``klass`` オブジェクトの取得対象である、 :class:`~django.db.models.Model`, :class:`~django.db.models.Manager` または :class:`~django.db.models.query.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()`` と同様、オブジェクトが複数見つかった場合には、 :class:`~django.core.exceptions.MultipleObjectsReturned` 例外が送出されます。 ``get_list_or_404`` =================== .. function:: get_list_or_404(klass, *args, **kwargs) 指定したモデルマネジャに対して :meth:`~django.db.models.query.QuerySet.filter` を呼び出した結果を返しま す。戻り値のリストが空なら、 :class:`django.http.Http404` を送出します。 必須の引数 ----------- ``klass`` オブジェクトの取得対象である、 :class:`~django.db.models.Model`, :class:`~django.db.models.Manager` または :class:`~django.db.models.query.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