Django - apa perbedaan antara render (), render_to_response () dan direct_to_template ()?


238

Apa perbedaannya (dalam bahasa yang bisa dipahami oleh python / django noob) di antara render(), render_to_response()dan direct_to_template()?

misalnya dari contoh aplikasi dasar 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,
    })

Tapi saya juga sudah melihatnya

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

Dan

    return direct_to_template(request, template_name, my_data_dictionary)

Apa bedanya, apa yang harus digunakan dalam situasi tertentu?

Jawaban:


185

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

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

render()adalah jalan pintas baru untuk versi render_to_response1.3 yang secara otomatis akan digunakan RequestContextyang pasti akan saya gunakan mulai sekarang.


EDIT 2020: Perlu dicatat bahwa render_to_response()telah dihapus di 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_responseadalah fungsi render standar Anda yang digunakan dalam tutorial dan semacamnya. Untuk menggunakan RequestContextAnda harus menentukancontext_instance=RequestContext(request)


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

direct_to_templateadalah pandangan umum yang saya gunakan dalam pandangan saya (tidak seperti dalam url saya) karena seperti render()fungsi baru , ia secara otomatis menggunakan RequestContextdan semua context_processors.

Tetapi direct_to_template harus dihindari karena pandangan umum berdasarkan fungsi sudah tidak digunakan lagi. Baik menggunakan renderatau kelas yang sebenarnya, lihat https://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

Saya senang saya tidak mengetik RequestContextdalam waktu yang lama.


1
Koreksi. Menurut dokumen render()tersedia dari 1.3.
AppleGrew

@ AppleGrew, tangkapan bagus! "Komunitas" memodifikasi posting saya untuk menunjuk ke cabang tertentu dan mereka memilih 1,4
Yuji 'Tomita' Tomita

6
Perhatikan: tampilan umum berbasis fungsi sudah usang, bukan tampilan berdasarkan fungsi . Tampilan umum yang dikirimkan dengan Django sekarang diimplementasikan menggunakan tampilan berbasis kelas (TemplatView), dulu digunakan sebagai fungsi (direct_to_template, dll). Tampilan diimplementasikan sebagai fungsi, preferensi pribadi saya, masih didukung dan itu tidak akan berubah.
Nick Zalutskiy

40

Mengulangi jawaban Yuri, Fábio, dan Frosts untuk Django noob (yaitu saya) - hampir pasti merupakan penyederhanaan, tetapi merupakan titik awal yang baik?

  • render_to_response()adalah "asli", tetapi mengharuskan Anda memasukkan context_instance=RequestContext(request)hampir setiap waktu, sebuah PITA.

  • direct_to_template()dirancang untuk digunakan hanya di urls.py tanpa tampilan yang ditentukan di views.py tetapi dapat digunakan di views.py untuk menghindari keharusan mengetikkan RequestContext

  • render()adalah jalan pintas untuk render_to_response()yang secara otomatis memasok context_instance=Request.... Ini tersedia dalam versi pengembangan Django (1.2.1) tetapi banyak yang telah membuat jalan pintas mereka sendiri seperti ini , yang ini atau yang melempar saya awalnya, Nathans basic.tools. shortcuts.py


Tautan pertama ( import-awesome.com/... ) memberi 404
Lucio

Ya, itu bisa terjadi pada tautan yang hampir 4 tahun!
Ryan

24

Render adalah

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

Jadi sebenarnya tidak ada perbedaan antara render_to_responsekecuali itu membungkus konteks Anda membuat template pra-prosesor bekerja.

Langsung ke templat adalah tampilan umum .

Sebenarnya tidak ada gunanya menggunakannya di sini karena ada overhead render_to_responsedi atas dalam bentuk fungsi tampilan.


12

Dari django docs :

render () sama dengan panggilan ke render_to_response () dengan argumen context_instance yang memaksa penggunaan RequestContext.

direct_to_templateadalah sesuatu yang berbeda. Ini adalah tampilan umum yang menggunakan kamus data untuk merender html tanpa memerlukan views.py, Anda menggunakannya di urls.py. Dokumen di sini


6

Hanya satu catatan yang tidak dapat saya temukan dalam jawaban di atas. Dalam kode ini:

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

Apa context_instancesebenarnya parameter ketiga ? Menjadi RequestContext itu mengatur beberapa konteks dasar yang kemudian ditambahkan user_context. Jadi templat mendapatkan konteks yang diperluas ini. Variabel apa yang ditambahkan diberikan oleh TEMPLATE_CONTEXT_PROCESSORSdi settings.py. Misalnya django.contrib.auth.context_processors.auth menambahkan variabel userdan variabel permyang kemudian dapat diakses dalam templat.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.