Django - Was ist der Unterschied zwischen render (), render_to_response () und direct_to_template ()?


238

Was ist der Unterschied zwischen einer Ansicht (in der Sprache ein Python / Django Noob kann verstehen) render(), render_to_response()und direct_to_template()?

zB aus Nathan Borrors grundlegenden Apps-Beispielen

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

Aber ich habe auch gesehen

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

Und

    return direct_to_template(request, template_name, my_data_dictionary)

Was ist der Unterschied, was in einer bestimmten Situation zu verwenden?

Antworten:


185

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

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

render()ist eine brandneue Abkürzung für Version render_to_response1.3, die automatisch verwendet wird und RequestContextdie ich von nun an definitiv verwenden werde.


2020 EDIT: Es sollte beachtet werden, dass render_to_response()in Django 3.0 entfernt wurde

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

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

render_to_responseist Ihre Standard-Renderfunktion, die in den Tutorials und dergleichen verwendet wird. Um zu verwenden RequestContext, müssten Sie angebencontext_instance=RequestContext(request)


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

direct_to_templateist eine generische Ansicht, die ich in meinen Ansichten verwende (im Gegensatz zu meinen URLs), da sie wie die neue render()Funktion automatisch RequestContextalle ihre context_processors verwendet.

Sollte direct_to_template jedoch vermieden werden, da funktionsbasierte generische Ansichten veraltet sind. Entweder verwenden renderoder eine tatsächliche Klasse, siehe https://docs.djangoproject.com/de/1.3/topics/generic-views-migration/

Ich bin froh, dass ich RequestContextlange nicht mehr getippt habe .


1
Korrektur. Laut docs render()ist ab 1.3 verfügbar.
— AppleGrew

@ AppleGrew, schöner Fang! Die "Community" hat meinen Beitrag so geändert, dass er auf bestimmte Zweige
— verweist,

6
Beachten Sie: Funktionsbasierte generische Ansichten sind veraltet, keine funktionsbasierten Ansichten . Generische Ansichten, die mit Django geliefert werden, werden jetzt mithilfe von klassenbasierten Ansichten (TemplateView) implementiert. Früher wurden sie als Funktionen implementiert (direct_to_template usw.). Als Funktionen implementierte Ansichten, meine persönliche Präferenz, werden weiterhin unterstützt und das wird sich nicht ändern.
— Nick Zalutskiy

40

Yuri, Fábio und Frosts Antworten für den Django Noob (dh mich) umformulieren - mit ziemlicher Sicherheit eine Vereinfachung, aber ein guter Ausgangspunkt?


Der erste Link ( import-awesome.com/… ) gibt 404
— Lucio

Ja, das kann bei Links passieren, die fast 4 Jahre alt sind!
— Ryan

24

Rendern ist

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

Es gibt also wirklich keinen Unterschied zwischen, render_to_responseaußer dass es Ihren Kontext umschließt, sodass die Vorlagenvorprozessoren funktionieren.

Direkt zur Vorlage ist eine generische Ansicht .

Es macht wirklich keinen Sinn, es hier zu verwenden, da es Overhead render_to_responsein Form einer Ansichtsfunktion gibt.


12

Aus Django- Dokumenten :

render () ist dasselbe wie ein Aufruf von render_to_response () mit einem context_instance-Argument, das die Verwendung eines RequestContext erzwingt.

direct_to_templateist etwas anderes. Es ist eine generische Ansicht, die ein Datenwörterbuch verwendet, um den HTML-Code ohne die Notwendigkeit von views.py zu rendern. Sie verwenden ihn in urls.py. Docs hier


6

Nur eine Anmerkung konnte ich in den obigen Antworten nicht finden. In diesem Code:

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

Was macht der dritte Parameter context_instanceeigentlich? Als RequestContext wird ein grundlegender Kontext eingerichtet, der dann hinzugefügt wird user_context. Die Vorlage erhält also diesen erweiterten Kontext. Welche Variablen hinzugefügt werden, wird TEMPLATE_CONTEXT_PROCESSORSin settings.py angegeben. Zum Beispiel fügt django.contrib.auth.context_processors.auth Variablen userund Variablen hinzu, auf permdie dann in der Vorlage zugegriffen werden kann .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.