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?

Ryan
sumber

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.

Yuji 'Tomita' Tomita
sumber
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

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

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

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

iklim
sumber