Django - render (), render_to_response () ve direct_to_template () arasındaki fark nedir?


238

Nedir arasındaki fark bir görünümde (dilde bir piton / Django çaylak anlayabiliriz) render(), render_to_response()ve direct_to_template()?

örneğin, Nathan Borror'un temel uygulama örneklerinden

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

Ama ben de gördüm

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

Ve

    return direct_to_template(request, template_name, my_data_dictionary)

Fark nedir, herhangi bir özel durumda ne kullanılır?

Yanıtlar:


185

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

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

render()şu andan itibaren kesinlikle render_to_responsekullanacağım otomatik olarak kullanacak 1.3 için bir marka spanking kısayoludur RequestContext.


2020 DÜZENLEME: render_to_response()Django 3.0'da kaldırıldığına dikkat edilmelidir

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

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

render_to_responseöğreticiler ve benzerlerinde kullanılan standart oluşturma işlevinizdir. Kullanmak RequestContextiçin şunu belirtmeniz gerekircontext_instance=RequestContext(request)


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

direct_to_templategörünümlerimde kullandığım (url'lerimin aksine) genel bir görünümdür, çünkü yeni render()işlev gibi otomatik olarak RequestContextve tüm özelliklerini kullanır context_processor.

Ancak işlev tabanlı genel görünümler kullanımdan kaldırıldığından direct_to_template kaçınılmalıdır . Ya rendergerçek bir sınıf kullanın , bkz. Https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

Çok RequestContextuzun zamandır yazmadığım için mutluyum .


1
Düzeltme. Dokümanlara göre render()1.3.
AppleGrew

@AppleGrew, güzel yakala! "Topluluk" görevimi belirli şubelere işaret edecek şekilde değiştirdi ve 1.4 seçtiler
Yuji 'Tomita' Tomita

6
Dikkat: fonksiyona dayalı genel görünümler kullanımdan kaldırılmıştır, fonksiyona dayalı görünümler kullanılmaz . Django ile birlikte gelen genel görünümler artık sınıf tabanlı görünümler (TemplateView) kullanılarak uygulanmakta, eskiden işlevler (direct_to_template vb.) Olarak uygulanıyordu. İşlev olarak uygulanan görünümler, kişisel tercihim, hala destekleniyor ve bu değişmeyecek.
Nick Zalutskiy

40

Yuri, Fábio ve Frosts'un yeniden yazılması Django noob (yani ben) için cevaplar - neredeyse kesin bir basitleştirme, ama iyi bir başlangıç ​​noktası?

  • render_to_response()"orijinal" dir, ancak context_instance=RequestContext(request)neredeyse her zaman bir PITA koymanızı gerektirir .

  • direct_to_template()views.py dosyasında tanımlanan bir görünüm olmadan yalnızca urls.py dosyasında kullanılmak üzere tasarlanmıştır ancak RequestContext yazmak zorunda kalmamak için views.py dosyasında kullanılabilir

  • render()için bir kısayol render_to_response()otomatik olarak sarf context_instance=Requestdjango geliştirme sürümü (1.2.1) 'de onun mevcut .... ama birçok gibi kendi kısayol oluşturdunuz bu bir , bu bir ya da bana attı başlangıçta, Nathans o biri basic.tools. shortcuts.py


İlk bağlantı ( import-awesome.com/… ) 404 veriyor
Lucio

Evet, neredeyse 4 yaşında olan bağlantılarda olabilir!
Ryan

24

Oluşturma:

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

Dolayısıyla render_to_response, şablon ön işlemcilerin çalışmasını sağlayan bağlamınızı sarması dışında gerçekten hiçbir fark yoktur .

Doğrudan şablona genel bir görünümdür .

Burada kullanmanın bir anlamı yok çünkü render_to_responsegörüş fonksiyonu şeklinde ek yük var .


12

Django dokümanlarından :

render (), bir RequestContext kullanımını zorlayan bir context_instance argümanıyla render_to_response () çağrısıyla aynıdır.

direct_to_templatefarklı bir şeydir. Views.py'ye gerek kalmadan html'yi oluşturmak için bir veri sözlüğü kullanan genel bir görünümdür, urls.py'de kullanırsınız. Dokümanlar burada


6

Yukarıdaki cevaplarda bulamadım sadece bir not. Bu kodda:

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

Üçüncü parametre context_instancegerçekte ne yapar? Being RequestContext o zaman eklenir bazı temel bağlamı kurar user_context. Böylece şablon bu genişletilmiş bağlamı alır. Eklenen değişkenler TEMPLATE_CONTEXT_PROCESSORSsettings.py'de verilir . Örneğin django.contrib.auth.context_processors.auth , daha sonra şablonda erişilebilir olan değişken userve değişken ekler perm.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.