2011-08-17 16 views
7

के आधार पर "आवश्यक" विशेषता को हटा दें मेरे पास कई फ़ील्ड के साथ मॉडलफॉर्म है। कुछ क्षेत्रों की आवश्यकता है, कुछ नहीं। इसके अलावा मेरे पास अलग-अलग विकल्पों के साथ फ़ील्ड का चयन है, और मैं कुछ फ़ील्ड "आवश्यक" बनाना चाहता हूं या इस चयन क्षेत्र विकल्प के आधार पर नहीं।Django modelform अन्य फ़ील्ड विकल्प

मैं फार्म की साफ विधि() में करने की कोशिश की

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      self.fields['other_field'].required = False 
    return cleaned_data 

लेकिन यह काम नहीं करता

उत्तर

10

Cleaning and validating fields that depend on each other पर Django दस्तावेज़ देखें। मानक अभ्यास के बजाय निपटने निम्नलिखित प्रदर्शन करने के लिए होगा:

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      # 'other_field' is conditionally required. 
      if not cleaned_data['other_field']: 
       raise forms.ValidationError("'Other_field' is required.") 
    return cleaned_data 
+0

धन्यवाद। इस विचार ने मुझे इसे पाने में मदद की! – Igor

+0

मुझे एक समान सत्यापन (Django 1.4) करने की आवश्यकता है, लेकिन जिस क्षेत्र में मैं परीक्षण कर रहा हूं वह केवल पढ़ा जाता है, इसलिए मेरे पास यह मेरे cleaned_data (btw - मैं इसे व्यवस्थापक में कर रहा हूं) में नहीं है। किसी भी विचार को इस क्षेत्र को पढ़ने के मूल्य को कैसे प्राप्त किया जाए? 10x – Lin

+0

समाधान मिला - form.instance में सभी प्रासंगिक डेटा हैं, और संशोधित डेटा form.changed_data – Lin

1

आप सही पता नहीं है, लेकिन समस्या यह है कि अलग-अलग क्षेत्र सत्यापन पहले से ही फार्म से पहले समाप्त हो गया है है स्वच्छ। आपके पास कुछ विकल्प हैं। आप फ़ील्ड को आवश्यक नहीं बना सकते हैं और आपके form.clean में इसकी आवश्यकता होने पर तर्क को नियंत्रित कर सकते हैं। या आप आवश्यकतानुसार फ़ील्ड छोड़ सकते हैं और स्वच्छता में उठाए गए सत्यापन त्रुटियों को हटा सकते हैं।

def clean(self): 
    cleaned_data = self.cleaned_data 
    some_field = cleaned_data.get("some_field") 
    if some_field == 'some_value': 
      if 'other_field' in self.errors: 
       del self.errors['other_field'] 
       cleaned_data['other_field'] = None 
    return cleaned_data 

यह है कि यह सभी त्रुटियों, न सिर्फ याद आ रही/आवश्यक त्रुटियों को दूर करता कुछ समस्या है। cleaned_data के साथ भी एक समस्या है। अब आपके पास एक आवश्यक फ़ील्ड है जो cleaned_data में नहीं है, इसलिए मैंने इसे None के रूप में जोड़ा है। आपके शेष एप्लिकेशन को इस मामले को संभालना होगा। यह आवश्यक फ़ील्ड रखने के लिए अजीब लग सकता है जिसमें कोई मूल्य नहीं है।

2

आप आम तरीका में आवश्यक फ़ील्ड के लिए त्रुटि संदेश प्रिंट करना चाहते हैं, तो आप ऐसा कर सकते हैं:

def clean(self): 
    cleaned_data = super(PasswordChangeForm, self).clean() 
    token = cleaned_data.get('token') 
    old_password = cleaned_data.get('old_password') 
    if not token and not old_password: 
     self._errors['old_password'] = self.error_class([self.fields['old_password'].error_messages['required']]) 
+0

यह उत्तर वास्तव में वास्तव में उपयोगी है! आपका बहुत बहुत धन्यवाद ! – Serafeim

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