कहें कि मेरे पास address
तालिका है और इसमें postal_code
फ़ील्ड है - ModelChoiceField मुझे अस्तित्व को सही करने के लिए पीके के अलावा किसी अन्य चीज़ का उपयोग करने की अनुमति नहीं देता है? जाने का रास्ता क्या होगा? सामान्य इनपुट और clean_*()
का उपयोग करें?Django ModelChoiceField - आईडी के अलावा कुछ और उपयोग करें?
उत्तर
मॉडलचॉइसफिल्ड्स का उपयोग मौजूदा मॉडल उदाहरणों के चयन के बीच करने के लिए किया जाना है। यह चयन क्षेत्र के कुछ रूपों द्वारा लगभग हमेशा सबसे अच्छा प्रतिनिधित्व किया जाता है।
यह कहा गया है कि क्या आप वास्तव में पते से डाक कोड को डाक_कोड के रूप में जानते हैं जैसा आप कह रहे हैं। आप प्रत्येक अतिरिक्त संबंधित क्वेरी के लिए अतिरिक्त तालिका को उचित ठहराने के लिए पोस्टलकोड तालिका पर क्या संग्रहीत कर रहे हैं?
ज्यादातर मामलों के लिए postal_code बस एक चार फ़ील्ड होना चाहिए और उस स्थिति में यदि आप मान्य करना चाहते हैं कि मान मान्य है तो आप वैध डाक कोड की सूची के साथ choices
विशेषता का उपयोग कर सकते हैं। ध्यान रखें कि हाथ से वैध डाक कोड की एक सूची बनाए रखना एक बड़ी परेशानी है।
यदि आपके पास वास्तव में पोस्टलकोड तालिका है और लगता है कि यह एक अच्छा विचार है (जो कुछ मामलों में हो सकता है) तो आप वास्तव में डिफ़ॉल्ट autoincrement की बजाय प्राथमिक कुंजी के रूप में postal_code का उपयोग करना चाह सकते हैं क्योंकि यह आवश्यक रूप से अद्वितीय है आपका डेटा अधिक निर्यात योग्य है, और सत्यापन के साथ आपकी समस्या हल करता है।
यदि postal_code
डाक कोड मॉडल के लिए एक विदेशी कुंजी है जिसमें वैध पोस्टल कोड हैं, तो मैं सिर्फ एक चरफ़ील्ड का उपयोग करने के लिए उपयोग करता हूं और फिर सुझाए गए जैसा साफ करता हूं। मेरी साफ विधि इस तरह दिखेगी:
def clean_postal_code(self):
try:
code = PostalCode.objects.get(code_field=self.data['postal_code'])
except:
raise forms.ValidationError("Please enter a valid postal code")
return code
to_field_name
के बारे में क्या? मुझे यकीन नहीं है कि यह कहीं भी दस्तावेज है, लेकिन आप ModelChoiceField
कन्स्ट्रक्टर पैराम्स के बीच आसानी से पा सकते हैं: https://github.com/django/django/blob/master/django/forms/models.py। इसका उपयोग क्षेत्र क्वेरीसेट फ़िल्टर करने के लिए किया जाता है।
उदाहरण के लिए:
articles = ModelChoiceField(queryset=Articles.objects.all(),
to_field_name='slug')
पूरी तरह से काम करता है। – user240515
सावधान रहें, 1.4 में (अभी तक 1.5 की कोशिश नहीं की है, माफ करना) 'उदाहरण' तर्क के साथ प्रयोग किया जाता है, क्योंकि 'model_to_dict' जबरन पीके (वास्तव में,' value_for_object') का उपयोग करता है। किसी के आसपास काम करने के लिए 'आपकाफॉर्म (..., उदाहरण = foo, प्रारंभिक = {"बार": foo.bar.slug} करना है) '। विवरण के लिए 'BaseModelForm .__ init__' कार्यान्वयन देखें। – drdaeman
@drdaeman [वास्तव में] (https://code.djangoproject.com/ticket/20202) – valtron
कैसे संबंध जहाज, की स्थापना की है 'postal_code' मॉडल की' primary_key' के साथ डिफ़ॉल्ट इसके द्वारा पर निर्भर करता है। क्या आप अपने 'पता' और संबंधित 'postal_code' मॉडल जैसे अधिक विवरण दे सकते हैं। डिफ़ॉल्ट रूप से 'ModelChoiceField' विकल्प के साथ एक ड्रॉपडाउन बनाता है जो संबंधित मॉडल के मौजूदा उदाहरणों के रूप में होता है। – Pannu