Django - रेंडर (), रेंडर_टो_प्रोसेस () और direct_to_template () के बीच क्या अंतर है?


238

अंतर क्या है (भाषा में एक अजगर / django noob समझ सकता है) के बीच एक दृश्य में render(), render_to_response()और direct_to_template()?

उदाहरण के लिए नाथन बोर्र्स के मूल एप्लिकेशन से

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_response1.3 में एक ऐसा नया शॉर्टकट है जो स्वचालित रूप से उपयोग करेगा RequestContextजो कि मैं अब से निश्चित रूप से उपयोग करूंगा।


2020 EDIT: यह ध्यान दिया जाना चाहिए कि 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एक सामान्य दृश्य है जिसे मैं अपने विचारों में उपयोग करता हूं (जैसा कि मेरे urls में विरोध किया गया है) क्योंकि नए 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
युजी 'टोमिता' टॉमिटा

6
ध्यान दें: फ़ंक्शन आधारित सामान्य दृश्य पदावनत किए जाते हैं, न कि फ़ंक्शन आधारित विचार । सामान्य विचार यह है कि Django के साथ जहाज अब क्लास आधारित विचारों (TemplateView) का उपयोग करके कार्यान्वित किया जाता है, उन्हें फ़ंक्शंस (direct_to_template, आदि) के रूप में लागू किया जाता है। फ़ंक्शंस के रूप में लागू किए गए दृश्य, मेरी व्यक्तिगत प्राथमिकता, अभी भी समर्थित हैं और यह नहीं बदलेगा।
निक ज़ालुत्सकी

40

यूरांगो, फेबियो, और फ्रॉस्ट्स का जवाब Django noob (यानी मेरे लिए) - लगभग निश्चित रूप से एक सरलीकरण, लेकिन एक अच्छा प्रारंभिक बिंदु है?

  • render_to_response()"मूल" है, लेकिन आपको context_instance=RequestContext(request)लगभग हर समय, एक पीआईटीए की आवश्यकता होती है।

  • direct_to_template()यह केवल Oracle में परिभाषित दृश्य के बिना urls.py में उपयोग किए जाने के लिए डिज़ाइन किया गया है, लेकिन RequestContext टाइप करने से बचने के लिए इसे view.py में उपयोग किया जा सकता है

  • render()उसके लिए एक शॉर्टकट है render_to_response()जो स्वचालित रूप से आपूर्ति करता है context_instance=Request.... यह django विकास संस्करण (1.2.1) में उपलब्ध है, लेकिन कई लोगों ने इस तरह के अपने शॉर्टकट बनाए हैं , यह एक या एक है जिसने मुझे शुरू में फेंक दिया, नातान मूल। मूल। shortcuts.py


पहला लिंक ( import-awesome.com/… ) दे रहा है 404
लुसियो

हाँ, यह लगभग 4 साल पुराने लिंक पर हो सकता है!
रयान

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 डॉक्स से :

रेंडर () एक कॉल के रूप में रेंडर_टो_response () के संदर्भ के रूप में एक ही है, जो कि एक RequestContext के उपयोग को मजबूर करता है।

direct_to_templateकुछ अलग है। यह एक सामान्य दृश्य है जो बिना किसी थ्योरी के html को रेंडर करने के लिए डेटा डिक्शनरी का उपयोग करता है, आप इसे 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सेटिंग में दिया जाता है। उदाहरण के लिए django.contrib.auth.context_processors.auth वैरिएबल userऔर वैरिएबल जोड़ता है permजो तब टेम्पलेट में पहुंच योग्य होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.