Django - qual è la differenza tra render (), render_to_response () e direct_to_template ()?


238

Qual è la differenza (nel linguaggio che un python / django noob può capire) in una vista tra render(), render_to_response()e direct_to_template()?

ad es. dagli esempi di app di base di 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,
    })

Ma ho anche visto

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

E

    return direct_to_template(request, template_name, my_data_dictionary)

Qual è la differenza, cosa usare in una situazione particolare?

Risposte:


185

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

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

render()è un marchio che sculaccia la nuova scorciatoia per la render_to_response1.3 che utilizzerà automaticamente RequestContextquello che sicuramente userò d' ora in poi.


2020 EDIT: Va notato che è render_to_response()stato rimosso in Django 3.0

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

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

render_to_responseè la tua funzione di rendering standard utilizzata nei tutorial e simili. Per usare RequestContextdovresti specificarecontext_instance=RequestContext(request)


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

direct_to_templateè una vista generica che utilizzo nei miei punti di vista (al contrario dei miei URL) perché, come la nuova render()funzione, utilizza automaticamente RequestContexte tutti i suoi messaggi context_processor.

Ma direct_to_template dovrebbe essere evitato poiché le viste generiche basate sulla funzione sono deprecate. Utilizzare rendero una classe effettiva, consultare https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

Sono felice di non aver digitato RequestContextper molto, molto tempo.


1
Correzione. Secondo i documenti render()è disponibile da 1.3.
Apple è cresciuto il

@AppleGrew, bella cattura! La "Community" ha modificato il mio post in modo da indicare settori specifici e hanno scelto 1.4
Yuji 'Tomita' Tomita

6
Nota: le viste generiche basate sulle funzioni sono obsolete, non le viste basate sulle funzioni . Le viste generiche fornite con Django sono ora implementate usando le viste basate sulla classe (TemplateView), erano implementate come funzioni (direct_to_template, ecc.). Le viste implementate come funzioni, le mie preferenze personali, sono ancora supportate e ciò non cambierà.
Nick Zalutskiy il

40

Ridefinendo le risposte di Yuri, Fábio e Frosts per il noob di Django (cioè io) - quasi certamente una semplificazione, ma un buon punto di partenza?

  • render_to_response()è "originale", ma richiede di inserire context_instance=RequestContext(request)quasi sempre un PITA.

  • direct_to_template()è progettato per essere utilizzato solo in urls.py senza una vista definita in views.py ma può essere utilizzato in views.py per evitare di digitare RequestContext

  • render()è una scorciatoia render_to_response()che fornisce automaticamente context_instance=Request.... È disponibile nella versione di sviluppo di django (1.2.1) ma molti hanno creato le proprie scorciatoie come questa , questa o quella che mi ha lanciato inizialmente, Nathans basic.tools. shortcuts.py


Il primo link ( import-awesome.com/… ) sta dando 404
Lucio

Sì, può succedere su link che hanno quasi 4 anni!
Ryan,

24

Il rendering è

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

Quindi non c'è davvero alcuna differenza tra render_to_responsetranne se avvolge il tuo contesto facendo funzionare i pre-processori di template.

Diretto al modello è una vista generica .

Non ha davvero senso usarlo qui perché c'è un sovraccarico render_to_responsesotto forma di funzione di visualizzazione.


12

Dai documenti di django :

render () è lo stesso di una chiamata a render_to_response () con un argomento context_instance che forza l'uso di un RequestContext.

direct_to_templateè qualcosa di diverso. È una vista generica che utilizza un dizionario di dati per rendere l'html senza la necessità di views.py, lo usi in urls.py. Documenti qui


6

Solo una nota che non ho trovato nelle risposte sopra. In questo codice:

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

Cosa context_instancefa effettivamente il terzo parametro ? Essendo RequestContext , imposta un contesto di base a cui viene aggiunto user_context. Quindi il modello ottiene questo contesto esteso. Quali variabili vengono aggiunte sono indicate TEMPLATE_CONTEXT_PROCESSORSin settings.py. Ad esempio django.contrib.auth.context_processors.auth aggiunge variabili usere variabili permche sono quindi accessibili nel modello.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.