Funciones y clases de corte

La paqueta django.shortcuts recopila funciones y clases auxiliares que «transcenden» múltiples niveles del patrón MVC. En otras palabras, estas funciones/clases introducen una acoplamiento controlado con fines de conveniencia.

render()

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

Combina un template dado con un diccionario de contexto determinado y devuelve un objeto HttpResponse que contiene ese texto renderizado.

Django no proporciona una función de atajo que devuelva un objeto TemplateResponse porque el constructor del objeto TemplateResponse ofrece el mismo nivel de conveniencia que la función render().

Argumentos requeridos

request

El objeto de solicitud utilizado para generar esta respuesta.

template_name

El nombre completo de un template a utilizar o secuencia de nombres de plantilla. Si se da una secuencia, el primer template que exista será utilizado. Consulte la documentación sobre carga de plantillas <template-loading> para obtener más información sobre cómo se encuentran las plantillas.

Argumentos opcionales

context

Un diccionario de valores para agregar al contexto del template. Por defecto, este es un diccionario vacío. Si un valor en el diccionario es llamable, la vista lo llamará justo antes de renderizar el template.

content_type

El tipo MIME a utilizar para el documento resultante. Por defecto, es 'text/html'.

status

El código de estado para la respuesta. Por defecto, es 200.

using

El nombre del motor de plantillas a utilizar para cargar el template. Consulte NAME.

Ejemplo

The following example renders the template myapp/index.html with the MIME type 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()

redirect(to, *args, permanent=False, preserve_request=False, **kwargs)[fuente]

Returns an HttpResponseRedirect a la URL adecuada para los argumentos pasados.

Los argumentos podrían ser:

  • Un modelo: se llamará a la función get_absolute_url() del modelo.

  • Un nombre de vista, posiblemente con argumentos: se utilizará reverse() para resolver el nombre en sentido inverso.

  • Una URL absoluta o relativa, que se utilizará tal cual como ubicación de redirección.

Por defecto, se emite una redirección temporal con un código de estado 302. Si permanent=True, se emite una redirección permanente con un código de estado 301.

Si preserve_request=True, la respuesta instruye al agente del usuario a preservar el método y el cuerpo de la solicitud original cuando se emita la redirección. En este caso, las redirecciones temporales utilizan un código de estado 307, y las redirecciones permanentes utilizan un código de estado 308. Esto se ilustra mejor en la siguiente tabla:

permanente

preservar_solicitud

Código de estado HTTP

Verdadero

Falso

301

Falso

Falso

302

Falso

Verdadero

307

Verdadero

Verdadero

308

La argumento preservar_solicitud se agregó.

Ejemplos

Puedes utilizar la función redirigir() de varias maneras.

  1. Al pasar algún objeto; el método get_absolute_url() de ese objeto se llamará para determinar la URL de redirección:

    from django.shortcuts import redirect
    
    
    def my_view(request):
        ...
        obj = MyModel.objects.get(...)
        return redirect(obj)
    
  2. Al pasar el nombre de una vista y opcionalmente algunos argumentos posicionales o de palabra clave; la URL se resolverá mediante el método reverse():

    def my_view(request):
        ...
        return redirect("some-view-name", foo="bar")
    
  3. By pasando una URL codificada directamente:

    def my_view(request):
        ...
        return redirect("/some/url/")
    

    También funciona con URLs completas:

    def my_view(request):
        ...
        return redirect("https://example.com/")
    

Por defecto, redirect() devuelve un redireccionamiento temporal. Todos los formatos anteriores aceptan el argumento permanent; si se establece a True, se devolverá un redireccionamiento permanente:

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

Además, se puede utilizar el argumento preserve_request para preservar el método HTTP original:

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()

get_object_or_404(klass, *args, **kwargs)[fuente]
aget_object_or_404(klass, *args, **kwargs)

Versión asíncrona: aget_object_or_404()

Llama a get() en un administrador de modelo dado, pero levanta Http404 en lugar de la excepción DoesNotExist del modelo.

Argumentos

klass

Una clase Model, un administrador Manager o una instancia QuerySet desde la que obtener el objeto.

args

:clase:`Q objetos <django.db.models.Q>`.

**kwargs

Parámetros de búsqueda, que deben estar en el formato aceptado por get() y filter().

Ejemplo

El siguiente ejemplo obtiene el objeto con la clave primaria 1 de 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.")

El caso de uso más común es pasar un :clase:`~django.db.models.Model`, como se muestra arriba. Sin embargo, también puedes pasar una instancia de :clase:`~django.db.models.query.QuerySet`:

queryset = Book.objects.filter(title__startswith="M")
get_object_or_404(queryset, pk=1)

El ejemplo anterior es un poco forzado ya que es equivalente a hacer

get_object_or_404(Book, title__startswith="M", pk=1)

pero puede ser útil si se te pasa la variable queryset desde otra parte.

Finalmente, también puedes utilizar un :clase:`~django.db.models.Manager`. Esto es útil por ejemplo si tienes un administrador personalizado:

get_object_or_404(Book.dahl_objects, title="Matilda")

También puedes usar :clase:`manejadores relacionados<django.db.models.fields.related.RelatedManager>`:

author = Author.objects.get(name="Roald Dahl")
get_object_or_404(author.book_set, title="Matilda")

Los textos traducidos son:

get_list_or_404()

get_list_or_404(klass, *args, **kwargs)[fuente]
aget_list_or_404(klass, *args, **kwargs)

Versión asíncrona: aget_list_or_404()

Devuelve el resultado de filter() en un administrador de modelos convertido a una lista, elevando Http404 si la lista resultante está vacía.

Argumentos

klass

Una instancia de Model, Manager o QuerySet desde el cual obtener la lista.

args

:clase:`Q objetos <django.db.models.Q>`.

**kwargs

Parámetros de búsqueda, que deben estar en el formato aceptado por get() y filter().

Ejemplo

El siguiente ejemplo obtiene todos los objetos publicados de 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.")