कुछ प्रासंगिक परिभाषाएं django/forms/forms.py
में होती हैं। वे हैं:
class BaseForm
class Form
class DeclarativeFieldsMetaclass
def get_declared_fields
get_declared_fields
DeclarativeFieldsMetaclass
से कहा जाता है और उनके निर्माण काउंटर के अनुसार क्रमबद्ध क्षेत्र उदाहरणों के साथ एक सूची का निर्माण करती है। इसके बाद यह बेस क्लास से फ़ील्ड को इस सूची में तैयार करता है और परिणाम को OrderedDict
उदाहरण के रूप में चार्ज के रूप में सेवा के क्षेत्र के साथ देता है। DeclarativeFieldsMetaclass
तब इस मान को विशेषता base_fields
में चिपकाता है और कक्षा बनाने के लिए type
पर कॉल करता है। इसके बाद यह वर्ग media_property
फ़ंक्शन को widgets.py
में पास करता है और नए वर्ग पर media
विशेषता पर वापसी मान को जोड़ता है।
media_property
एक ऐसी संपत्ति विधि देता है जो प्रत्येक पहुंच पर मीडिया घोषणाओं का पुनर्निर्माण करता है। मेरी भावना यह है कि यह यहां प्रासंगिक नहीं होगा लेकिन मैं गलत हो सकता हूं।
किसी भी दर पर, यदि आप एक Media
विशेषता (और आधार वर्ग के कर कोई नहीं) की घोषणा नहीं कर रहे हैं तो यह केवल निर्माता के लिए कोई तर्क के साथ एक ताजा Media
उदाहरण देता है और मुझे लगता है कि पर एक नए क्षेत्र monkeypatching होना चाहिए क्षेत्र को मैन्युअल रूप से base_fields
में डालने के रूप में सरल।
ContactForm.another_field = forms.CharField(...)
ContactForm.base_fields['another_field'] = ContactForm.another_field
प्रत्येक प्रपत्र उदाहरण तो base_fields
कि BaseForm
की __init__
विधि में form_instance.fields
हो जाता है की एक deepcopy
हो जाता है। HTH।
आप लगभग निश्चित रूप से सही हैं। यही कारण है कि आप आसानी से मॉडल में नए फ़ील्ड नहीं जोड़ सकते हैं। मॉडल उपclass। –
मॉडल के साथ बंदर पैचिंग काम करने के बावजूद "syncdb" परेशानी है। लेकिन फॉर्म बंदर पैचिंग के साथ कुछ समय आईएमएचओ में एक जीवन बचतकर्ता हो सकता है। –