2011-03-30 7 views
6

पहली छोटी पृष्ठभूमि ... मैं Django में फॉर्म के कार्यान्वयन को समझने के लिए Django स्रोत कोड पर जा रहा था (और रास्ते में कुछ पायथन सीखना)। Django एक DeclaredMetaFields मेटाक्लास का उपयोग कर फ़ॉर्म लागू करता है।django- जैसे फॉर्म कार्यान्वयन में मेटाक्लास का उपयोग करने के क्या फायदे हैं?

यहां एक Django- जैसे फॉर्म कार्यान्वयन (link गीस्ट में नमूना कोड के लिए) का एक बहुत ही क्रूड क्लास आरेख है।

Django-form-like implementation of ContactForm - Class Diagram

और यहाँ एक उदाहरण चित्र है।

Django-form-like implementation of ContactForm - Instance Diagram

यहाँ मेटा-वर्ग (link सार में कोड नमूने के लिए) का सहारा के बिना एक बहुत कच्चे कार्यान्वयन एक ही वर्ग है।

A simple and crude implementation of ContactForm

मैं metaclass अवधारणाओं आदि को समझते हैं और समझ कैसे Django कोड काम करता है। अब प्रश्नों के लिए।

  1. मेटा-क्लास कार्यान्वयन के लिए सिंटैक्टिकल लालित्य आदि जैसे स्पष्ट लाभों के अलावा अन्य कोई लाभ हैं?
  2. क्या मेटा-क्लास कार्यान्वयन की तरह कार्यान्वयन संभव है जैसे बाउंडफिल्ड जैसे मध्यवर्ती वस्तु का उपयोग किए बिना?

उत्तर

2

अच्छी तरह से वाक्य रचनात्मक लाभ बहुत मायने रखता है। ओओपी भाषाओं में भी कक्षाओं के बाद भाषा का सिर्फ एक वाक्य रचनात्मक लाभ है।

मेटा-वर्ग-कम फॉर्म कार्यान्वयन के बहुत क्रूड कार्यान्वयन के आपके उदाहरण में आप डिक्ट में फ़ील्ड का वर्णन करते हैं। खैर आपने अनदेखा किया होगा कि यह वास्तव में SortedDict है, क्योंकि फ़ील्ड मामलों का क्रम। तो मुझे fields_order सूची को भी परिभाषित करने की आवश्यकता होगी।

अगला बड़ी बात ModelForm है। मेटा-क्लास दृष्टिकोण केवल यह कहने की अनुमति देता है कि मैं कौन सा मॉडल उपयोग करता हूं और कौन सा फ़ील्ड Meta विशेषता में है और यह स्वचालित रूप से मॉडल को मॉडल बनाने और मानचित्र बनाता है। मेटाक्लास दृष्टिकोण के बिना मुझे शायद CreateFieldsFromModel और MapFieldsToModel जैसे कुछ उपयोग करना होगा। या आप __init__ विधि में मेरे लिए ऐसा कर सकते हैं। लेकिन प्रतीक्षा करें, __init__ विधि data, initial, files, और बहुत कुछ जैसे कई तर्कों के साथ पहले से ही जटिल है।

class MyForm(Form): 
    fields = { 
     'one': ... 
     ... 
    } 
    fields_order = [...] 
    model_fields = ??? 

Class MyForm2(MyForm): 
    fields = MyForm.fields + {...} 

# ... hey this API sucks! I think I'll go with another framework. 

और कई और चीजें हैं जिन्हें फ़ॉर्म में कॉन्फ़िगर किया जा सकता है और सब कुछ दस्तावेज है।

इसलिए मेरे लिए, विशाल कॉन्फ़िगरेशन तर्क के कारण, ऐसा लगता है कि Form केवल परिभाषा-वस्तु और फैक्ट्री-तर्क के माध्यम से लागू होने के लिए कहता है। और यहां उपयोगकर्ता से कारखाने को छिपाने के लिए इसके मेटाक्लास के साथ अजगर आता है। और यह अच्छा है क्योंकि यह शुरुआती लोगों को कम सोचने के लिए बनाता है।

और अच्छी तरह से इसके आसपास सिंटैक्टिकल चीनी और इसके सभी एपीआई का उपयोग करने में आसान बनाने के बारे में।

और हाँ मेटाक्लास/बाउंडफिल्ड या जो भी कुछ भी उपयोग नहीं करना संभव है।अंत में एक समारोह में रूपों के सभी कार्यान्वयन को लिखना संभव है और एक परिभाषा (या xml?) में सभी परिभाषाएं हैं, लेकिन क्या इसका उपयोग करना आसान होगा, समझने में आसान, विस्तार करना आसान होगा?

+0

मेरे लिए आपके द्वारा सबसे महत्वपूर्ण बिंदु बनाया गया है ... "फ़ॉर्म केवल परिभाषा-वस्तु और फैक्ट्री-तर्क के माध्यम से लागू करने के लिए कहता है। और यहां उपयोगकर्ता से कारखाने को छिपाने के लिए इसके मेटाक्लास के साथ अजगर आता है।" मुझे लगता है कि मैं सोच रहा था कि एपीआई अबास्ट्रक्शन का एक ही स्तर मेटाक्लास के बिना पूरा किया जा सकता है, लेकिन मेटाक्लास क्लीनर हैं और अंतिम उपयोगकर्ता से बहुत सारे विवरण छिपाते हैं (और चूंकि वे स्रोत कोड में दूर हो जाते हैं, उपयोगकर्ता वास्तव में विवरण के बारे में ज्यादा परेशान करने की ज़रूरत नहीं है)। प्रश्न का उत्तर देने के लिए समय निकालने के लिए धन्यवाद। –

संबंधित मुद्दे