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?
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)
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.
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 mettrecontext_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 pourrender_to_response()
qui fournit automatiquementcontext_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
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.
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
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.