2010-12-02 12 views
11

मेरे पास मेरे फॉर्म पर एक चयन सूची ड्रॉपडाउन बॉक्स है जो मॉडल (डायरेक्टर) से डेटा के साथ पॉप्युलेट किया गया है। इस ड्रॉपडाउन के मूल्य को सहेजने की आवश्यकता नहीं है; यह वास्तव में केवल गति के रूप में गतिशील रूप से ट्रिगर करने के लिए उपयोग किया जाता है (फिल्म्स नामक एक ड्रॉपडाउन)। तो जब उपयोगकर्ता निदेशक चुनता है, तो वह उस निदेशक से जुड़ी फिल्मों के साथ दूसरी सूची को गतिशील रूप से पॉप्युलेट करता है।एक django फॉर्म तत्व पर डेटा सत्यापन को ओवरराइड करें

पहली सूची का पहला तत्व "सभी निदेशक" है। फिल्म सूची को फ़िल्टर करने के बजाय, यह सभी फिल्मों को दूसरी सूची में दिखाया जा सकता है क्योंकि सभी निदेशकों को चुना जाता है।

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

मैं मॉडलफॉर्म का उपयोग कर रहा हूं। मैं निदेशक फॉर्म फ़ील्ड पर डेटा सत्यापन को अक्षम या ओवरराइड कैसे कर सकता हूं ताकि वह उस क्षेत्र की त्रुटि को अनदेखा कर सके?

उत्तर

26

तरीका सबसे आसान फार्म मान्य है, इस तरह के लिए अपनी खुद की विधि को परिभाषित करने के होगा:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = WhateverModel 

    def clean(self): 
     super(MyForm, self).clean() #if necessary 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
     return self.cleaned_data        

यह कैसे ModelForms पर लागू होता है के लिए एक वृहद व्याख्या के लिए http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other और http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method देखें।

+0

'सुपर (माईफॉर्म, स्वयं) .clean() 'क्या यह डिफ़ॉल्ट मॉडल-आधारित सत्यापन को अभी भी सक्रिय होने की अनुमति देगा? – andi

+0

हां। फ़ॉर्म की क्लीन विधि तक पहुंचने से पहले, फ़ील्ड सत्यापनकर्ता पहले से ही चलाए जायेंगे। आप यह जांच सकते हैं कि उन्होंने फ़ॉर्म की "त्रुटियों" विशेषता में कुछ त्रुटियां उत्पन्न की हैं या नहीं। (Django 1.8) –

6

किसी कारण स्वीकार किए जाते हैं जवाब मेरे लिए काम नहीं किया के लिए (पता नहीं है अगर यह के कारण चीजें बदल गई, या मैं एक इनलाइन फार्म या क्या उपयोग कर रहा हूँ), लेकिन अधिभावी full_clean काम किया:

class MyForm(forms.ModelForm): 
    def full_clean(self): 
     super(MyForm, self).full_clean() 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
+0

मैं दूसरा क्या @ जैक कहते हैं। – prinzdezibel

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