238 votos

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

¿Cuál es la diferencia (en lengua puede entender un noob python/django) en una vista entre render() , render_to_response() y 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, lo que pueden usar en cualquier 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 una marca nalgadas nuevo acceso directo para render_to_response 1.3 que usará automáticamente RequestContext que definitivamente voy a utilizar de ahora en adelante.


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 el estándar de procesamiento función que se utiliza en los tutoriales y tal. Para utilizar RequestContext tendrías 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 yo uso en mis opiniones (como opuesto a en mi url) porque al igual que la nueva render() función, automáticamente se utiliza RequestContext y todos sus context_processors.

Pero direct_to_template debe ser evitado como función genérica puntos de vista están en desuso. Utilice render o una clase real, ver https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

Estoy feliz de que no he escrito RequestContext en un largo, largo tiempo.

40voto

Ryan Puntos 11565

Reformular Yuri, Fábio, y las Heladas respuestas para el Django de noob (es decir. me) - casi sin duda una simplificación, pero es un buen punto de partida?

  • render_to_response() es el "original", pero es necesario poner context_instance=RequestContext(request) en casi todo el tiempo, un pan de PITA.

  • direct_to_template() está diseñado para ser utilizado sólo en urls.py sin un punto de vista definido en views.py pero puede ser usado en views.py para evitar tener que escribir RequestContext

  • render() es un acceso directo para render_to_response() que automáticamente suministros context_instance=Request.... A su disposición, en la que django versión de desarrollo (1.2.1), pero muchos han creado sus propios accesos directos como este, este o el que me lanzó inicialmente, Nathans basic.tools.shortcuts.py

24voto

Frost.baka Puntos 2173

Procesamiento 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 no hay ninguna diferencia entre render_to_response excepto su elaboración del contexto en que se envuelve los procesadores previos plantilla trabajan.

Directa a plantilla es una visión genérica.

No hay ningún sentido en usarlo aquí porque hay sobrecarga sobre render_to_response en forma de función de vista.

12voto

Fábio Diniz Puntos 4110

A partir de django docs:

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

direct_to_template es algo diferente. Es una vista genérica que utiliza un diccionario de datos para representar el html sin necesidad de la views.py, se utiliza en urls.py. Docs aquí

6voto

clime Puntos 2431

Sólo una nota que no he podido encontrar en las respuestas anteriores. En este código:

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

Lo que el tercer parámetro context_instance realmente hace? Se RequestContext establece básicos de contexto, los cuales se agregan a user_context. Por lo que la plantilla se presenta esta extensión de contexto. ¿Qué variables se añaden está dada por TEMPLATE_CONTEXT_PROCESSORS en settings.py. Por ejemplo django.contrib.auth.context_processors.auth añade variable user y la 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