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?

Ryan
quelle

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 .

Yuji 'Tomita' Tomita
quelle
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?

Ryan
quelle
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.

Frost.baka
quelle
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

Fábio Diniz
quelle
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 .

Klima
quelle