Django - ความแตกต่างระหว่าง render (), render_to_response () และ direct_to_template () คืออะไร?


238

Whats ความแตกต่าง (ในภาษางูหลาม / Django Noob สามารถเข้าใจ) ในมุมมองระหว่างrender(), render_to_response()และdirect_to_template()?

เช่นจากตัวอย่างแอพพื้นฐานของ 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,
    })

แต่ฉันก็เคยเห็นเช่นกัน

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

และ

    return direct_to_template(request, template_name, my_data_dictionary)

อะไรคือสิ่งที่จะใช้ในสถานการณ์เฉพาะใด ๆ

คำตอบ:


185

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

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

render()เป็นทางลัดใหม่สำหรับแบรนด์render_to_responseใน 1.3 ที่จะใช้โดยอัตโนมัติRequestContextซึ่งฉันจะใช้อย่างแน่นอนที่สุดนับจากนี้เป็นต้นไป


2020 แก้ไข: ควรสังเกตว่าrender_to_response()ถูกลบใน 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เป็นฟังก์ชั่นการเรนเดอร์มาตรฐานของคุณที่ใช้ในบทช่วยสอนและ หากต้องการใช้RequestContextคุณจะต้องระบุcontext_instance=RequestContext(request)


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

direct_to_templateเป็นมุมมองทั่วไปที่ผมใช้ในมุมมองของฉัน (เมื่อเทียบกับใน URL ของฉัน) เพราะชอบใหม่render()ฟังก์ชั่นมันจะใช้RequestContextและทุกcontext_processorวินาที

แต่direct_to_template ควรหลีกเลี่ยงเนื่องจากมุมมองทั่วไปที่อิงกับฟังก์ชันเลิกใช้แล้ว ใช้renderหรือคลาสจริงดูhttps://docs.djangoproject.com/en/1.3/topics/generic-views-migration/

ฉันมีความสุขฉันไม่ได้พิมพ์RequestContextในเวลานานนาน


1
การแก้ไข ตามเอกสารrender()มีให้ตั้งแต่ 1.3
AppleGrew

@AppleGrew จับได้ดี! "ชุมชน" แก้ไขโพสต์ของฉันให้ชี้ไปที่สาขาเฉพาะและพวกเขาเลือก 1.4
Yuji 'Tomita' Tomita

6
ทำหมายเหตุ: ฟังก์ชั่นตามมุมมองทั่วไปจะเลิกไม่ได้ฟังก์ชั่นตามมุมมอง มุมมองทั่วไปที่มาพร้อมกับ Django ตอนนี้มีการใช้งานโดยใช้มุมมองตามระดับ (TemplateView) ซึ่งเคยถูกนำมาใช้เป็นฟังก์ชั่น (direct_to_template ฯลฯ ) มุมมองที่ใช้งานเป็นฟังก์ชั่นความชอบส่วนตัวของฉันยังคงได้รับการสนับสนุนและจะไม่เปลี่ยนแปลง
Nick Zalutskiy

40

การรื้อฟื้นคำตอบของ Yuri, Fábioและ Frosts สำหรับ Django noob (เช่นฉัน) - เกือบจะเป็นเรื่องง่าย แต่ก็เป็นจุดเริ่มต้นที่ดี?

  • render_to_response()คือ "ต้นฉบับ" แต่คุณต้องใส่context_instance=RequestContext(request)PITA เกือบตลอดเวลา

  • direct_to_template()ถูกออกแบบมาเพื่อใช้ใน urls.py โดยไม่ต้องมีมุมมองที่กำหนดไว้ใน views.py แต่สามารถใช้ใน views.py เพื่อหลีกเลี่ยงการพิมพ์ RequestContext

  • render()เป็นทางลัดสำหรับrender_to_response()ที่ให้โดยอัตโนมัติcontext_instance=Request.... มันมีอยู่ในรุ่นพัฒนา Django (1.2.1) แต่หลายคนได้สร้างทางลัดของตัวเองเช่นนี้ , คนนี้หรือคนที่โยนฉันแรก Nathans basic.tools shortcuts.py


ลิงก์แรก ( import-awesome.com/… ) ให้ 404
Lucio

ใช่มันสามารถเกิดขึ้นได้กับลิงค์ที่มีอายุเกือบ 4 ปี!
Ryan

24

เรนเดอร์คือ

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

ดังนั้นจึงไม่มีความแตกต่างระหว่างrender_to_responseมันยกเว้นบริบทของคุณทำให้แม่แบบตัวประมวลผลล่วงหน้าทำงาน

ตรงไปยังแม่แบบเป็นมุมมองทั่วไป

มันไม่มีเหตุผลที่จะใช้มันที่นี่เพราะมันมีโอเวอร์เฮดrender_to_responseในรูปแบบของฟังก์ชั่นการดู


12

จาก django docs :

render () เหมือนกับการเรียกร้องให้ render_to_response () พร้อมอาร์กิวเมนต์ context_instance ที่บังคับให้ใช้ RequestContext

direct_to_templateเป็นสิ่งที่แตกต่าง เป็นมุมมองทั่วไปที่ใช้พจนานุกรมข้อมูลเพื่อแสดงผล html โดยไม่ต้องใช้ views.py คุณใช้เป็น urls.py เอกสารที่นี่


6

มีเพียงโน้ตเดียวที่ฉันไม่พบในคำตอบข้างต้น ในรหัสนี้:

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

พารามิเตอร์ที่สามcontext_instanceทำอะไรได้จริง? เป็นRequestContextมันตั้งค่าบริบทพื้นฐานบางอย่างซึ่งจะถูกเพิ่มไปuser_contextแล้ว ดังนั้นเทมเพลตจึงได้รับบริบทเพิ่มเติมนี้ มีการเพิ่มตัวแปรใดบ้างTEMPLATE_CONTEXT_PROCESSORSใน settings.py ตัวอย่างเช่น django.contrib.auth.context_processors.auth เพิ่มตัวแปรuserและตัวแปรpermที่สามารถเข้าถึงได้ในแม่แบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.