238 votos

Django - ¿Cuál es la diferencia entre render(), render_to_response() y direct_to_template()?

¿Cuál es la diferencia (en lenguaje que un novato en Python/django pueda entender) en una vista entre render() , render_to_response() y direct_to_template() ?

por ejemplo, de 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 cada situación particular?

185voto

Yuji 'Tomita' Tomita Puntos 46106

https://docs.djangoproject.com/en/1.3/topics/http/shortcuts/#render

render(request, template[, dictionary][, context_instance][, content_type][, status][, current_app])

render() es un nuevo atajo para render_to_response en 1.3 que utilizará automáticamente RequestContext que definitivamente usaré a partir de ahora.


https://docs.djangoproject.com/en/1.3/topics/http/shortcuts/#render-to-response

render_to_response(template[, dictionary][, context_instance][, mimetype])¶

render_to_response es la función de renderización estándar que se utiliza en los tutoriales y demás. Para utilizar RequestContext tendría que especificar context_instance=RequestContext(request)


https://docs.djangoproject.com/en/1.3/ref/generic-views/#django-views-generic-simple-direct-to-template

direct_to_template es una vista genérica que uso en mis vistas (en lugar de en mis urls) porque como el nuevo render() utiliza automáticamente la función RequestContext y toda su context_processor s.

Pero direct_to_template debe evitarse ya que las vistas genéricas basadas en funciones están obsoletas. Utilice render o una clase real, véase https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

Estoy feliz de no haber escrito RequestContext en mucho, mucho tiempo.

40voto

Ryan Puntos 11565

Reformulando las respuestas de Yuri, Fábio y Frosts para los novatos de Django (es decir, yo) - casi seguramente una simplificación, pero un buen punto de partida?

  • render_to_response() es el "original", pero requiere que pongas context_instance=RequestContext(request) en casi todo el tiempo, un PITA.

  • direct_to_template() está diseñado para ser utilizado sólo en urls.py sin una vista definida en views.py pero se puede utilizar en views.py para evitar tener que escribir RequestContext

  • render() es un atajo para render_to_response() que suministra automáticamente context_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 desconcertó inicialmente, Nathans herramientas.básicas.atajos.py

24voto

Frost.baka Puntos 2173

Renderizar es

def render(request, *args, **kwargs):
    """ Simple wrapper for render_to_response. """
    kwargs['context_instance'] = RequestContext(request)
    return render_to_response(*args, **kwargs)

Así que realmente no hay diferencia entre render_to_response excepto que envuelve su contexto haciendo que los preprocesadores de plantillas funcionen.

Directamente a la plantilla es un vista genérica .

Realmente no tiene sentido usarlo aquí porque hay una sobrecarga render_to_response en forma de función de vista.

12voto

Fábio Diniz Puntos 4110

De django docs :

render() es lo mismo que una llamada a render_to_response() con un argumento context_instance que fuerza el uso de un RequestContext.

direct_to_template es algo diferente. Es una vista genérica que usa un diccionario de datos para renderizar el html sin necesidad del views.py, lo usas en urls.py. Docs aquí

6voto

clime Puntos 2431

Sólo una nota que no encontré en las respuestas anteriores. En este código:

context_instance = RequestContext(request)
return render_to_response(template_name, user_context, context_instance)

Cuál es el tercer parámetro context_instance ¿realmente lo hace? En RequestContext establece un contexto básico que luego se añade a user_context . Así que la plantilla recibe este contexto ampliado. Las variables que se añaden vienen dadas por TEMPLATE_CONTEXT_PROCESSORS en settings.py. Por ejemplo django.contrib.auth.context_processors.auth añade la variable user y variable perm que son accesibles en la plantilla.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X