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.
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().
requestEl objeto de solicitud utilizado para generar esta respuesta.
template_nameEl 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.
contextUn 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.
El tipo MIME a utilizar para el documento resultante. Por defecto, es 'text/html'.
El código de estado para la respuesta. Por defecto, es 200.
El nombre del motor de plantillas a utilizar para cargar el template. Consulte NAME.
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")
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 |
|---|---|---|
|
|
301 |
|
|
302 |
|
|
307 |
|
|
308 |
La argumento preservar_solicitud se agregó.
Puedes utilizar la función redirigir() de varias maneras.
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)
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")
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()¶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.
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()¶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.
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.")
may 31, 2026