Django - quelle est la différence entre render(), rendre réponse() et directs (template)?

Quelle est la différence (en langage qu'un python/django noob peut comprendre) dans une vue entre render() , render_to_response() et direct_to_template() ?

p.ex. de Nathan Borror's basic apps exemples

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,
    })

mais j'ai aussi vu

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

et

    return direct_to_template(request, template_name, my_data_dictionary)

Quelle est la différence, que faut-il utiliser dans une situation particulière?

219
demandé sur Ryan 2011-03-01 15:13:50

5 réponses

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

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

render() est un nouveau raccourci de marque pour render_to_response en 1.3 qui utilisera automatiquement RequestContext que je vais certainement utiliser à partir de maintenant.


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

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

render_to_response est votre fonction de rendu standard utilisée dans les tutoriels et autres. Pour utiliser RequestContext vous devez spécifier context_instance=RequestContext(request)


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

direct_to_template est une vue générique que j'utilise dans mes vues (par opposition à dans Mes urls) parce que comme le nouveau render() , il utilise automatiquement RequestContext et tous ses context_processor S.

mais direct_to_template devrait être évitée car les vues génériques basées sur la fonction sont dépréciées. Utilisez render ou une classe réelle, voir https://docs.djangoproject.com/en/1.3/topics/generic-views-migration /

je suis content de ne pas avoir tapé RequestContext depuis très, très longtemps.

174
répondu Yuji 'Tomita' Tomita 2015-09-30 13:02:37

Reformuler Yuri, Fábio, et les Gelées réponses pour le Django noob (c'est à dire moi) - presque certainement une simplification, mais un bon point de départ?

  • render_to_response() est "l'original", mais nécessite de mettre context_instance=RequestContext(request) dans presque tout le temps, une PITA.

  • direct_to_template() est conçu pour être utilisé urls.py sans une vue définie dans views.py mais il peut être utilisé dans views.py pour éviter D'avoir à taper RequestContext

  • render() est un raccourci pour render_to_response() qui fournit automatiquement context_instance=Request .... Il est disponible dans la version de développement de django (1.2.1) mais beaucoup ont créé leurs propres raccourcis tels que celui-ci , celui-ci ou celui qui m'a lancé initialement, Nathans basic.tools.shortcuts.py

36
répondu Ryan 2014-11-27 18:19:37

Rendu

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

donc il n'y a vraiment aucune différence entre render_to_response sauf qu'il enveloppe votre contexte faisant fonctionner les pré-processeurs de modèle.

Directement à un modèle est un vue générique .

il n'y a vraiment aucun sens à l'utiliser ici parce qu'il y a au-dessus de render_to_response sous la forme de la fonction de vue.

23
répondu Frost.baka 2013-07-19 10:13:37

From django docs :

render () est la même chose qu'un appel à render_to_response() avec un context_instance argument que les forces de l'utilisation d'un RequestContext.

direct_to_template est quelque chose de différent. C'est une vue générique qui utilise un dictionnaire de données pour rendre le html sans le besoin de views.py, vous l'utilisez dans urls.py. Docs here

12
répondu Fábio Diniz 2012-06-09 09:12:21

juste une note que je n'ai pas pu trouver dans les réponses ci-dessus. Dans ce code:

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

Que fait réellement le troisième paramètre context_instance ? Étant RequestContext il établit un contexte de base qui est ensuite ajouté à user_context . Donc le modèle obtient ce contexte étendu. Quelles variables sont ajoutées est donnée par TEMPLATE_CONTEXT_PROCESSORS dans settings.py. Par exemple django.contrib.auth.context_processeurs.auth ajoute la variable user et variable perm qui sont alors accessibles dans le modèle.

5
répondu clime 2013-03-29 22:02:44