2010-02-21 17 views
12

मैं Django (और पायथन) के लिए नया हूं, और यह पता लगाने की कोशिश कर रहा हूं कि फॉर्म सत्यापन के कुछ पहलुओं को सशर्त कैसे बनाया जाए। इस मामले में, एप्लिकेशन में एक HTML इंटरफ़ेस है जहां उपयोगकर्ता विजेट से दिनांक और समय चुन सकता है। फॉर्म ऑब्जेक्ट पर clean विधि समय और दिनांक फ़ील्ड के मान लेती है और उन्हें datetime में बदल देती है।Django फॉर्म सत्यापन: "आवश्यक" सशर्त बनाना?

एचटीएमएल इंटरफ़ेस के अलावा, वहाँ भी एक iPhone आवेदन में कॉल करने के ग्राहक है, और मैं में एक यूनिक्स टाइमस्टैम्प शैली समय मान पास करना चाहते हैं

मेरे प्रपत्र कोड इस तरह दिखता है:।

class FooForm(forms.ModelForm): 
    foo_date    = forms.CharField(required=True, widget=forms.RadioSelect(choices=DATE_CHOICES)) 
    foo_time    = forms.CharField(required=True, widget=SelectTimeWidget()) 
    foo_timestamp  = forms.CharField(required=False) 

मैं foo_date और foo_time आवश्यक जब तकfoo_timestamp प्रदान की जाती है कैसे कर सकता हूँ?

उत्तर

21

यह फॉर्म पर clean विधि के साथ किया जाता है। आपको foo_date और foo_time से required=False सेट करने की आवश्यकता है, हालांकि clean केवल प्रत्येक फ़ील्ड को सत्यापित करने के बाद ही बुलाया जाता है (documentation भी देखें)।

class FooForm(forms.Form) 
    # your field definitions 

    def clean(self): 
     data = self.cleaned_data 
     if data.get('foo_timestamp', None) or (data.get('foo_date', None) and data.get('foo_time', None)): 
      return data 
     else: 
      raise forms.ValidationError('Provide either a date and time or a timestamp') 
+0

धन्यवाद, मैं सोच रहा था कि 'साफ' संभवतः ऐसा करने का स्थान था। क्या यह संभव है कि, 'foo_date' और' foo_time' फ़ील्ड्स के विरुद्ध सत्यापन त्रुटि हो, एक सामान्य फ़ॉर्म सत्यापन त्रुटि बनाम? धन्यवाद, क्रिस – ChrisW

+1

यह –

+0

से जुड़े दस्तावेज़ों में दूसरे उदाहरण में समझाया गया है। आरटीएफएम; धन्यवाद, मैं खोदूँगा। – ChrisW

8

मुझे खुद को ऐसा करने के लिए "मानक" तरीका चाहिए, क्योंकि मेरे रूपों में कई सशर्त रूप से आवश्यक फ़ील्ड हैं। मेरी प्रपत्र के स्वच्छ विधि में

def validate_required_field(self, cleaned_data, field_name, message="This field is required"): 
    if(field_name in cleaned_data and cleaned_data[field_name] is None): 
     self._errors[field_name] = self.error_class([message]) 
     del cleaned_data[field_name] 

और फिर मेरे पास है:

def clean(self): 
    cleaned_data = super(FormClass, self).clean() 
    if(condition): 
     self.validate_required_field(cleaned_data, 'field_name') 

यह अब तक मेरे लिए पूरी तरह से काम किया है तो मैं निम्न विधि के साथ एक सुपर क्लास बनाया।

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