Django: ¿cuál es la diferencia entre render(), render_to_response() y direct_to_template()?
¿Cuál es la diferencia (en un lenguaje que un novato de Python/Django puede entender) en una vista entre render()
y ?render_to_response()
direct_to_template()
por ejemplo, de los ejemplos de aplicaciones básicas de Nathan Borror
def comment_edit(request, object_id, template_name='comments/edit.html'):
comment = get_object_or_404(Comment, pk=object_id, user=request.user)
# ...
return render(request, template_name, {
'form': form,
'comment': comment,
})
Pero también he visto
return render_to_response(template_name, my_data_dictionary,
context_instance=RequestContext(request))
Y
return direct_to_template(request, template_name, my_data_dictionary)
¿Cuál es la diferencia, qué usar en una situación particular?
https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render
render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])
render()
es un nuevo atajo para render_to_response
la versión 1.3 que usará automáticamente RequestContext
y que definitivamente usaré de ahora en adelante.
EDICIÓN 2020: Cabe señalar que render_to_response()
se eliminó en Django 3.0
https://docs.djangoproject.com/en/1.8/topics/http/shortcuts/#render-to-response
render_to_response(template[, dictionary][, context_instance][, mimetype])¶
render_to_response
es su función de renderizado estándar utilizada en los tutoriales y demás. Para usarlo RequestContext
tendrías que especificarcontext_instance=RequestContext(request)
https://docs.djangoproject.com/en/1.8/ref/generic-views/#django-views-generic-simple-direct-to-template
direct_to_template
es una vista genérica que uso en mis vistas (a diferencia de mis URL) porque, al igual que la nueva render()
función, usa automáticamente RequestContext
todos sus context_processor
s.
Pero direct_to_template
debe evitarse ya que las vistas genéricas basadas en funciones están en desuso. Ya sea uso render
o una clase real, consulte https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/
Estoy feliz de no haber escrito RequestContext
en mucho, mucho tiempo.
Reformular las respuestas de Yuri, Fábio y Frosts para el novato de Django (es decir, yo): casi con certeza una simplificación, pero ¿un buen punto de partida?
render_to_response()
es el "original", pero requiere que coloquescontext_instance=RequestContext(request)
casi todo el tiempo un PITA.direct_to_template()
está diseñado para usarse solo en urls.py sin una vista definida en views.py pero se puede usar en views.py para evitar tener que escribir RequestContextrender()
es un atajorender_to_response()
que suministra automáticamentecontext_instance=Request
.... Está disponible en la versión de desarrollo de Django (1.2.1) pero muchos han creado sus propios atajos como este , este o el que me lanzó inicialmente, Nathans basic.tools. atajos.py
renderizar es
def render(request, *args, **kwargs):
""" Simple wrapper for render_to_response. """
kwargs['context_instance'] = RequestContext(request)
return render_to_response(*args, **kwargs)
Entonces, realmente no hay diferencia entre ellos, render_to_response
excepto que envuelve su contexto y hace que los preprocesadores de plantilla funcionen.
Directo a plantilla es una vista genérica .
Realmente no tiene sentido usarlo aquí porque hay una sobrecarga render_to_response
en forma de función de vista.
De documentos de Django :
render() es lo mismo que una llamada a render_to_response() con un argumento context_instance que fuerza el uso de RequestContext.
direct_to_template
es algo diferente. Es una vista genérica que usa un diccionario de datos para representar el html sin la necesidad de views.py, lo usas en urls.py. Documentos aquí