TemplateResponse y SimpleTemplateResponse¶Los objetos estándar HttpResponse son estructuras estáticas. Se proporcionan con un bloque de contenido pre-renderizado en el momento de la construcción, y si bien ese contenido puede modificarse, no lo hace de una forma que haga fácil las modificaciones.
Sin embargo, a veces puede ser beneficioso permitir decoradores o middleware para modificar una respuesta después de que se ha construido por la vista. Por ejemplo, puedes querer cambiar el template que se utiliza, o poner datos adicionales en el contexto.
TemplateResponse proporciona una forma de hacer exactamente eso. A diferencia de los objetos básicos HttpResponse, los objetos TemplateResponse retienen los detalles del template y del contexto que se proporcionó por la vista para calcular la respuesta. El resultado final de la respuesta no se calcula hasta que sea necesario, más tarde en el proceso de respuesta.
SimpleTemplateResponse objetos¶El nombre del template a renderizar. Acepta un objeto de plantilla dependiente del backend (como aquellos devueltos por get_template()), el nombre de una plantilla o una lista de nombres de plantillas.
Ejemplo: ['foo.html', 'path/to/bar.html']
Los datos de contexto a utilizar al renderizar la plantilla. Deben ser un dict.
Ejemplo: {'foo': 123}
Instancia un objeto SimpleTemplateResponse con el template dado, contexto, tipo de contenido, estado HTTP y codificación de caracteres.
template`Un objeto de plantilla dependiente del backend (como aquellos devueltos por get_template()), el nombre de una plantilla o una lista de nombres de plantillas.
Un dict de valores a agregar al contexto de la plantilla. Por defecto, este es un diccionario vacío.
content_typeEl valor incluido en el encabezado HTTP Content-Type, incluyendo la especificación del tipo MIME y la codificación de caracteres. Si se especifica content_type, entonces su valor se utiliza. De lo contrario, se utiliza 'text/html'.
statusEl código de estado HTTP para la respuesta.
charsetEl charset en el que se codificará la respuesta. Si no se proporciona, se extraerá de content_type, y si eso falla, se utilizará la configuración DEFAULT_CHARSET.
usandoEl nombre (NAME) de un motor de plantillas para usar para cargar la plantilla.
headersUn diccionario (dict) de encabezados HTTP a agregar a la respuesta.
Preprocesa los datos del contexto que se utilizarán para renderizar una plantilla. Acepta un diccionario (dict) de datos del contexto. Por defecto, devuelve el mismo dict.
Sobreescribe este método para personalizar el contexto.
Resuelve la instancia de plantilla a utilizar para renderizar. Acepta un objeto de plantilla dependiente del backend (como los devueltos por get_template()), el nombre de una plantilla o una lista de nombres de plantillas.
Devuelve el objeto de plantilla dependiente del backend a renderizar.
Sobreescribe este método para personalizar la carga de plantillas.
Agrega un callback que se invocará después de que haya tenido lugar el renderizado. Esta función de llamada puede utilizarse para diferir ciertas operaciones de procesamiento (como la caché) hasta después del renderizado.
Si el objeto de respuesta SimpleTemplateResponse ya ha sido renderizado, se invocará inmediatamente al callback.
Cuando se llama a los callbacks, se les pasará un argumento único – la instancia del objeto de respuesta SimpleTemplateResponse renderizado.
Si el callback devuelve un valor que no es None, este será utilizado como respuesta en lugar del objeto de respuesta original (y se le pasará al siguiente callback post-rendering, etc.).
Establece response.content en el resultado obtenido por SimpleTemplateResponse.rendered_content, ejecuta todos los callbacks post-rendering y devuelve el objeto de respuesta resultante.
La función render() solo tendrá efecto la primera vez que se llame. En llamadas posteriores, devolverá el resultado obtenido de la primera llamada.
TemplateResponse¶TemplateResponse es una subclase de SimpleTemplateResponse que conoce sobre el objeto de solicitud actual HttpRequest.
Instancia un objeto TemplateResponse con la solicitud, plantilla, contexto, tipo de contenido, estado HTTP y codificación dadas.
Una instancia del objeto de solicitud HttpRequest.
template`Un objeto de plantilla dependiente del backend (como aquellos devueltos por get_template()), el nombre de una plantilla o una lista de nombres de plantillas.
Un dict de valores a agregar al contexto de la plantilla. Por defecto, este es un diccionario vacío.
content_typeEl valor incluido en el encabezado HTTP Content-Type, incluyendo la especificación del tipo MIME y la codificación de caracteres. Si se especifica content_type, entonces su valor se utiliza. De lo contrario, se utiliza 'text/html'.
statusEl código de estado HTTP para la respuesta.
charsetEl charset en el que se codificará la respuesta. Si no se proporciona, se extraerá de content_type, y si eso falla, se utilizará la configuración DEFAULT_CHARSET.
usandoEl nombre (NAME) de un motor de plantillas para usar para cargar la plantilla.
headersUn diccionario (dict) de encabezados HTTP a agregar a la respuesta.
Antes de que una instancia de TemplateResponse pueda ser devuelta al cliente, debe ser renderizada. El proceso de renderizado toma la representación intermedia del template y contexto, y la convierte en el flujo de bytes final que puede ser servido al cliente.
Hay tres circunstancias bajo las cuales una TemplateResponse será renderizada:
Cuando la instancia de TemplateResponse es explícitamente renderizada, utilizando el método SimpleTemplateResponse.render().
Cuando se asigna explícitamente el contenido de la respuesta mediante response.content.
Después de pasar por middleware de respuesta de template, pero antes de pasar por middleware de respuesta.
Una TemplateResponse solo puede ser renderizada una vez. La primera llamada al método SimpleTemplateResponse.render() establece el contenido de la respuesta; las llamadas de renderizado posteriores no cambian el contenido de la respuesta.
Sin embargo, cuando se asigna explícitamente response.content, siempre se aplica el cambio. Si deseas forzar que el contenido se vuelva a renderizar, puedes reevaluar el contenido renderizado y asignar manualmente el contenido de la respuesta:
# Set up a rendered TemplateResponse
>>> from django.template.response import TemplateResponse
>>> t = TemplateResponse(request, "original.html", {})
>>> t.render()
>>> print(t.content)
Original content
# Re-rendering doesn't change content
>>> t.template_name = "new.html"
>>> t.render()
>>> print(t.content)
Original content
# Assigning content does change, no render() call required
>>> t.content = t.rendered_content
>>> print(t.content)
New content
Algunas operaciones – como la caché – no pueden ser realizadas en un template no renderizado. Deben ser realizadas en una respuesta completa y renderizada.
Si estás utilizando middleware, puedes hacer eso. El middleware proporciona varias oportunidades para procesar una respuesta al salir de una vista. Si pones el comportamiento en el middleware de respuesta, está garantizado que se ejecute después del renderizado del template.
Sin embargo, si estás utilizando un decorador, las mismas oportunidades no existen. Cualquier comportamiento definido en un decorador se maneja inmediatamente.
Para compensar esto (y cualquier otro caso análogo), TemplateResponse te permite registrar callbacks que se invocarán cuando la renderización haya completado. Utilizando este callback, puedes diferir el procesamiento crítico hasta un punto en el que puedas garantizar que el contenido renderizado estará disponible.
Para definir un callback de post-renderizado, define una función que tome un argumento único – respuesta – y registra esa función con la respuesta del template:
from django.template.response import TemplateResponse
def my_render_callback(response):
# Do content-sensitive processing
do_post_processing()
def my_view(request):
# Create a response
response = TemplateResponse(request, "mytemplate.html", {})
# Register the callback
response.add_post_render_callback(my_render_callback)
# Return the response
return response
my_render_callback() se invocará después de que mytemplate.html haya sido renderizado, y le proporcionará el objeto TemplateResponse completamente renderizado como argumento.
Si el template ya ha sido renderizado, el callback se invocará inmediatamente.
TemplateResponse y SimpleTemplateResponse¶Un objeto TemplateResponse se puede utilizar en cualquier lugar donde se pueda utilizar un normal django.http.HttpResponse. También se puede utilizar como alternativa a llamar a render().
Por ejemplo, la siguiente vista devuelve un TemplateResponse con un template y un contexto que contiene una queryset:
from django.template.response import TemplateResponse
def blog_index(request):
return TemplateResponse(
request, "entry_list.html", {"entries": Entry.objects.all()}
)
may 31, 2026