123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- =========================
- Django shortcut functions
- =========================
- .. module:: django.shortcuts
- :synopsis:
- Convenience shortcuts that span multiple levels of Django's MVC stack.
- .. index:: shortcuts
- The package ``django.shortcuts`` collects helper functions and classes that
- "span" multiple levels of MVC. In other words, these functions/classes
- introduce controlled coupling for convenience's sake.
- ``render()``
- ============
- .. function:: render(request, template_name, context=None, content_type=None, status=None, using=None)
- Combines a given template with a given context dictionary and returns an
- :class:`~django.http.HttpResponse` object with that rendered text.
- Django does not provide a shortcut function which returns a
- :class:`~django.template.response.TemplateResponse` because the constructor
- of :class:`~django.template.response.TemplateResponse` offers the same level
- of convenience as :func:`render()`.
- Required arguments
- ------------------
- ``request``
- The request object used to generate this response.
- ``template_name``
- The full name of a template to use or sequence of template names. If a
- sequence is given, the first template that exists will be used. See the
- :ref:`template loading documentation <template-loading>` for more
- information on how templates are found.
- Optional arguments
- ------------------
- ``context``
- A dictionary of values to add to the template context. By default, this
- is an empty dictionary. If a value in the dictionary is callable, the
- view will call it just before rendering the template.
- ``content_type``
- The MIME type to use for the resulting document. Defaults to
- ``'text/html'``.
- ``status``
- The status code for the response. Defaults to ``200``.
- ``using``
- The :setting:`NAME <TEMPLATES-NAME>` of a template engine to use for
- loading the template.
- Example
- -------
- The following example renders the template ``myapp/index.html`` with the
- MIME type :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",
- )
- This example is equivalent to::
- 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()``
- ==============
- .. function:: redirect(to, *args, permanent=False, preserve_request=False, **kwargs)
- Returns an :class:`~django.http.HttpResponseRedirect` to the appropriate URL
- for the arguments passed.
- The arguments could be:
- * A model: the model's :meth:`~django.db.models.Model.get_absolute_url()`
- function will be called.
- * A view name, possibly with arguments: :func:`~django.urls.reverse` will be
- used to reverse-resolve the name.
- * An absolute or relative URL, which will be used as-is for the redirect
- location.
- By default, a temporary redirect is issued with a 302 status code. If
- ``permanent=True``, a permanent redirect is issued with a 301 status code.
- If ``preserve_request=True``, the response instructs the user agent to
- preserve the method and body of the original request when issuing the
- redirect. In this case, temporary redirects use a 307 status code, and
- permanent redirects use a 308 status code. This is better illustrated in the
- following table:
- ========= ================ ================
- permanent preserve_request HTTP status code
- ========= ================ ================
- ``True`` ``False`` 301
- ``False`` ``False`` 302
- ``False`` ``True`` 307
- ``True`` ``True`` 308
- ========= ================ ================
- .. versionchanged:: 5.2
- The argument ``preserve_request`` was added.
- Examples
- --------
- You can use the :func:`redirect` function in a number of ways.
- #. By passing some object; that object's
- :meth:`~django.db.models.Model.get_absolute_url` method will be called
- to figure out the redirect URL::
- from django.shortcuts import redirect
- def my_view(request):
- ...
- obj = MyModel.objects.get(...)
- return redirect(obj)
- #. By passing the name of a view and optionally some positional or
- keyword arguments; the URL will be reverse resolved using the
- :func:`~django.urls.reverse` method::
- def my_view(request):
- ...
- return redirect("some-view-name", foo="bar")
- #. By passing a hardcoded URL to redirect to:
- ::
- def my_view(request):
- ...
- return redirect("/some/url/")
- This also works with full URLs:
- ::
- def my_view(request):
- ...
- return redirect("https://example.com/")
- By default, :func:`redirect` returns a temporary redirect. All of the above
- forms accept a ``permanent`` argument; if set to ``True`` a permanent redirect
- will be returned::
- def my_view(request):
- ...
- obj = MyModel.objects.get(...)
- return redirect(obj, permanent=True)
- Additionally, the ``preserve_request`` argument can be used to preserve the
- original HTTP method::
- 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)
- # ...
- ``get_object_or_404()``
- =======================
- .. function:: get_object_or_404(klass, *args, **kwargs)
- .. function:: aget_object_or_404(klass, *args, **kwargs)
- *Asynchronous version*: ``aget_object_or_404()``
- Calls :meth:`~django.db.models.query.QuerySet.get()` on a given model
- manager, but it raises :class:`~django.http.Http404` instead of the model's
- :class:`~django.db.models.Model.DoesNotExist` exception.
- Arguments
- ---------
- ``klass``
- A :class:`~django.db.models.Model` class,
- a :class:`~django.db.models.Manager`,
- or a :class:`~django.db.models.query.QuerySet` instance from which to get
- the object.
- ``*args``
- :class:`Q objects <django.db.models.Q>`.
- ``**kwargs``
- Lookup parameters, which should be in the format accepted by ``get()`` and
- ``filter()``.
- Example
- -------
- The following example gets the object with the primary key of 1 from
- ``MyModel``::
- from django.shortcuts import get_object_or_404
- def my_view(request):
- obj = get_object_or_404(MyModel, pk=1)
- This example is equivalent to::
- 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.")
- The most common use case is to pass a :class:`~django.db.models.Model`, as
- shown above. However, you can also pass a
- :class:`~django.db.models.query.QuerySet` instance::
- queryset = Book.objects.filter(title__startswith="M")
- get_object_or_404(queryset, pk=1)
- The above example is a bit contrived since it's equivalent to doing::
- get_object_or_404(Book, title__startswith="M", pk=1)
- but it can be useful if you are passed the ``queryset`` variable from somewhere
- else.
- Finally, you can also use a :class:`~django.db.models.Manager`. This is useful
- for example if you have a
- :ref:`custom manager<custom-managers>`::
- get_object_or_404(Book.dahl_objects, title="Matilda")
- You can also use
- :class:`related managers<django.db.models.fields.related.RelatedManager>`::
- author = Author.objects.get(name="Roald Dahl")
- get_object_or_404(author.book_set, title="Matilda")
- Note: As with ``get()``, a
- :class:`~django.core.exceptions.MultipleObjectsReturned` exception
- will be raised if more than one object is found.
- ``get_list_or_404()``
- =====================
- .. function:: get_list_or_404(klass, *args, **kwargs)
- .. function:: aget_list_or_404(klass, *args, **kwargs)
- *Asynchronous version*: ``aget_list_or_404()``
- Returns the result of :meth:`~django.db.models.query.QuerySet.filter()` on
- a given model manager cast to a list, raising :class:`~django.http.Http404`
- if the resulting list is empty.
- Arguments
- ---------
- ``klass``
- A :class:`~django.db.models.Model`, :class:`~django.db.models.Manager` or
- :class:`~django.db.models.query.QuerySet` instance from which to get the
- list.
- ``*args``
- :class:`Q objects <django.db.models.Q>`.
- ``**kwargs``
- Lookup parameters, which should be in the format accepted by ``get()`` and
- ``filter()``.
- Example
- -------
- The following example gets all published objects from ``MyModel``::
- from django.shortcuts import get_list_or_404
- def my_view(request):
- my_objects = get_list_or_404(MyModel, published=True)
- This example is equivalent to::
- 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.")
|