Django - qual é a diferença entre render (), render_to_response () e direct_to_template ()?

238

Qual é a diferença (na linguagem que um python / django noob pode entender) em uma visão entre render(), render_to_response()e direct_to_template()?

por exemplo, dos exemplos de aplicativos básicos de 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,
    })

Mas eu também vi

    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 é a diferença, o que usar em qualquer situação específica?

Ryan
fonte

Respostas:

185

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

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

render()é um novo atalho da marca para a versão render_to_response1.3 que usará automaticamente o RequestContextque eu definitivamente usarei a partir de agora.


EDIÇÃO 2020: Note-se que render_to_response()foi removido no 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é a sua função de renderização padrão usada nos tutoriais e tal. Para usar RequestContextvocê teria que especificarcontext_instance=RequestContext(request)


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

direct_to_templateé uma visão genérica que eu uso nas minhas visões (e não nos meus URLs) porque, como na nova render()função, ela usa automaticamente RequestContexttodos os seus context_processors.

Mas direct_to_template deve ser evitado, pois as visualizações genéricas baseadas em funções são descontinuadas. Uso renderou classe real, consulte https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

Estou feliz que não digito RequestContexthá muito, muito tempo.

Tomita, Yuji Tomita
fonte
1
Correção. De acordo com o docs, render()está disponível na versão 1.3.
AppleGrew
@AppleGrew, nice catch! A "Comunidade" modificou meu post para apontar para ramos específicos e eles escolheram 1.4
Yuji 'Tomita' Tomita
6
Observe: as visualizações genéricas baseadas em funções estão obsoletas, e não as visualizações baseadas em funções . As visões genéricas que acompanham o Django agora são implementadas usando visões baseadas em classe (TemplateView), elas costumavam ser implementadas como funções (direct_to_template, etc). As visualizações implementadas como funções, minha preferência pessoal, ainda são suportadas e isso não muda.
Nick Zalutskiy 27/03/2013
40

Reformulando as respostas de Yuri, Fábio e Frosts para o Django noob (ou seja, eu) - quase certamente uma simplificação, mas um bom ponto de partida?

  • render_to_response()é o "original", mas exige que você coloque context_instance=RequestContext(request)quase o tempo todo, uma PITA.

  • direct_to_template()foi projetado para ser usado apenas em urls.py sem uma visualização definida em views.py, mas pode ser usado em views.py para evitar a necessidade de digitar RequestContext

  • render()é um atalho para render_to_response()o fornecimento automático context_instance=Request... Está disponível na versão de desenvolvimento do django (1.2.1), mas muitos criaram seus próprios atalhos como este , este ou aquele que me lançou inicialmente, Nathans basic.tools. shortcuts.py

Ryan
fonte
O primeiro link ( import-awesome.com/… ) está dando 404
Lucio
Sim, isso pode acontecer em links com quase 4 anos de idade!
21913 Ryan
24

Render é

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

Portanto, não há realmente nenhuma diferença entre, render_to_responseexceto que envolve o seu contexto, fazendo com que os pré-processadores de modelos funcionem.

Direto para o modelo é uma exibição genérica .

Realmente não faz sentido usá-lo aqui, porque há sobrecarga render_to_responsena forma de função de visualização.

Frost.baka
fonte
12

Dos documentos do django :

render () é o mesmo que uma chamada para render_to_response () com um argumento context_instance que força o uso de um RequestContext.

direct_to_templateé algo diferente. É uma visão genérica que usa um dicionário de dados para renderizar o html sem a necessidade do views.py, você o usa em urls.py. Documentos aqui

Fábio Diniz
fonte
6

Apenas uma nota que não encontrei nas respostas acima. Neste código:

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

O que o terceiro parâmetro context_instancerealmente faz? Sendo RequestContext, ele configura algum contexto básico ao qual é adicionado user_context. Portanto, o modelo obtém esse contexto estendido. Quais variáveis ​​são adicionadas são fornecidas TEMPLATE_CONTEXT_PROCESSORSem settings.py. Por exemplo, django.contrib.auth.context_processors.auth adiciona variáveis usere variáveis permque são acessíveis no modelo.

clima
fonte