Django 2.1 - The form rendering API

प्रपत्र रेंडरिंग एपीआई




django

प्रपत्र रेंडरिंग एपीआई

Django के फार्म विजेट्स को Django के टेम्पलेट इंजन सिस्टम का उपयोग करके प्रदान किया जाता है

प्रपत्र रेंडरिंग प्रक्रिया को कई स्तरों पर अनुकूलित किया जा सकता है:

  • विजेट कस्टम टेम्पलेट नाम निर्दिष्ट कर सकते हैं।
  • प्रपत्र और विजेट कस्टम रेंडरर कक्षाएं निर्दिष्ट कर सकते हैं।
  • एक विजेट का टेम्प्लेट प्रोजेक्ट द्वारा ओवरराइड किया जा सकता है। (पुन: प्रयोज्य अनुप्रयोगों को आमतौर पर अंतर्निहित टेम्प्लेट को ओवरराइड नहीं करना चाहिए क्योंकि वे किसी प्रोजेक्ट के कस्टम टेम्प्लेट के साथ संघर्ष कर सकते हैं।)

निम्न-स्तरीय रेंडर एपीआई

फॉर्म टेम्प्लेट का प्रतिपादन एक अनुकूलन रेंडर क्लास द्वारा नियंत्रित किया जाता है। FORM_RENDERER सेटिंग को अपडेट करके एक कस्टम रेंडर निर्दिष्ट किया जा सकता है। यह ' django.forms.renderers.DjangoTemplates ' को डिफॉल्ट करता है।

आप Form.default_renderer विशेषता सेट करके या Widget.render() के renderer तर्क का उपयोग करके एक कस्टम रेंडरर भी प्रदान कर सकते हैं।

अंतर्निहित टेम्पलेट फॉर्म रेंडर में से किसी एक का उपयोग करें या अपना स्वयं का कार्यान्वयन करें। कस्टम रेंडरर्स को एक render(template_name, context, request=None) विधि लागू करनी चाहिए। यह एक प्रदान किए गए टेम्प्लेट (एक स्ट्रिंग के रूप में) को वापस करना चाहिए या TemplateDoesNotExist बढ़ाएं।

अंतर्निर्मित टेम्पलेट रेंडरर्स

DjangoTemplates

class DjangoTemplates [source]

यह रेंडरर एक स्टैंडअलोन DjangoTemplates इंजन का उपयोग करता है (जो आपको DjangoTemplates सेटिंग में कॉन्फ़िगर हो सकता है) से जुड़ा हुआ नहीं है। यह पहले app_directories django/forms/templates में बिल्ट-इन फॉर्म टेम्प्लेट डाइरेक्टरी से और फिर app_directories लोडर का उपयोग करके इंस्टॉल किए गए एप्स के टेंपलेट डायरेक्टरी से app_directories करता है।

यदि आप अपने टेम्प्लेट सेटिंग से कस्टमाइज़ेशन के साथ टेम्प्लेट को रेंडर करना चाहते हैं, जैसे कि उदाहरण के लिए संदर्भ प्रोसेसर, TemplatesSetting रेंडरर का उपयोग करें।

Jinja2

class Jinja2 [source]

यह रेंडरर django.forms.renderers.DjangoTemplates रेंडरर के समान है सिवाय इसके कि यह एक Jinja2 बैकएंड का उपयोग करता है। अंतर्निहित विजेट्स के लिए टेम्पलेट django/forms/jinja2 में स्थित हैं और इंस्टॉल किए गए एप्लिकेशन jinja2 निर्देशिका में टेम्पलेट प्रदान कर सकते हैं।

इस बैकएंड का उपयोग करने के लिए, आपके प्रोजेक्ट और उसके तृतीय-पक्ष एप्लिकेशन के सभी विजेट्स में Jinja2 टेम्प्लेट होने चाहिए। जब तक आप विगेट्स के लिए अपना स्वयं का जिन्जा 2 टेम्प्लेट प्रदान नहीं करते हैं, जो आपके पास नहीं है, आप इस रेंडरर का उपयोग नहीं कर सकते। उदाहरण के लिए, django.contrib.admin में Django टेम्प्लेट टैग के उपयोग के कारण अपने विजेट के लिए जिनजा 2 टेम्प्लेट शामिल नहीं हैं।

TemplatesSetting

class TemplatesSetting [source]

यह रेंडरर आपको पूर्ण नियंत्रण देता है कि विजेट टेम्प्लेट को कैसे सॉर्ट किया जाता है। यह TEMPLATES सेटिंग में कॉन्फ़िगर किए गए के आधार पर विजेट टेम्पलेट खोजने के लिए get_template() का उपयोग करता है।

अंतर्निहित विजेट टेम्पलेट्स के साथ इस रेंडरर का उपयोग करने की आवश्यकता है:

  • INSTALLED_APPS में 'django.forms' और APP_DIRS=True साथ कम से कम एक इंजन।
  • आपके एक टेम्पलेट इंजन के DIRS में DIRS विगेट्स टेम्प्लेट निर्देशिका को DIRS । उस पथ को उत्पन्न करने के लिए:

    import django
    django.__path__[0] + '/forms/templates'  # or '/forms/jinja2'
    

इस रेंडरर का उपयोग करने के लिए आपको यह सुनिश्चित करने की आवश्यकता होती है कि आपकी परियोजना की जरूरत के रूप में टेम्प्लेट हो।

विजेट टेम्पलेट्स में उपलब्ध संदर्भ

विजेट टेम्पलेट Widget.get_context() से एक संदर्भ प्राप्त करते हैं। डिफ़ॉल्ट रूप से, विगेट्स संदर्भ, widget में एक ही मूल्य प्राप्त करते हैं। यह एक ऐसा शब्दकोश है जिसमें मान शामिल हैं:

  • name
  • value
  • attrs
  • is_hidden
  • template_name

कुछ विजेट संदर्भ में और जानकारी जोड़ते हैं। उदाहरण के लिए, सभी विजेट जो Input को उप-वर्ग में परिभाषित करते हैं, widget['type'] और MultiWidget widget['subwidgets'] को लूपिंग उद्देश्यों के लिए widget['subwidgets'] परिभाषित करता है।

अंतर्निहित विजेट टेम्पलेट ओवरराइड करना

प्रत्येक विजेट में input.html जैसे मान के साथ एक template_name विशेषता input.html । अंतर्निहित विजेट टेम्पलेट django/forms/widgets पथ में संग्रहीत किए जाते हैं। आप उदाहरण के लिए django/forms/widgets/input.html को परिभाषित करके input.html लिए एक कस्टम टेम्पलेट प्रदान कर सकते हैं। प्रत्येक विजेट के टेम्पलेट के नाम के लिए अंतर्निहित विजेट देखें।

यदि आप TemplatesSetting रेंडरर का उपयोग करते हैं, तो ओवरराइडिंग विजेट टेम्प्लेट आपकी परियोजना के किसी भी अन्य टेम्प्लेट को ओवरराइड करने के समान ही काम करता है। आप अन्य अंतर्निहित रेंडरर्स का उपयोग करके अंतर्निहित विजेट टेम्प्लेट को ओवरराइड नहीं कर सकते।