2009-12-09 11 views
7

पर कॉल नहीं कर रहा है, मैं एक फॉर्म को सत्यापित करने का प्रयास कर रहा हूं (और यह पहले काम करता था)। किसी कारण से, मुझे form.is_valid() कहा जाता है जब मुझे कॉल करने के लिए clean_username (self) जैसे विभिन्न सफाई कार्यों को प्रतीत नहीं होता है।Django clean_<fieldname>

मुझे पता है कि लगभग पर्याप्त जाँच करता है नहीं कर रहे हैं अभी तक (वे निर्माण आप देख ;-) तहत कर रहे हैं), लेकिन यहाँ मेरी वर्ग हैं:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=30) 
    password = forms.CharField(max_length=30,widget=forms.PasswordInput) 

    def clean_password(self): 
     print "Cleaning password" 
     password = self.cleaned_data['password'] 
     if password == u"": 
      raise forms.ValidationError("Password is blank.") 
     return password 

    def clean_username(self): 
     username = self.cleaned_data['username'] 
     if len(username) < 4: 
      raise forms.ValidationError("Username is fewer than four charecters.") 
     return username 


class RegistrationForm(LoginForm): 
     confirm_password = forms.CharField(widget=forms.PasswordInput, max_length=30) 
     email = forms.EmailField() 

     def clean_confirm_password(self): 
      print "Cleaning confirm password" 
      clean_confirm_password = self.cleaned_data['confirm_password'] 
      if clean_confirm_password == u"": 
       raise forms.ValidationError("Confirming password is blank.") 
      return clean_confirm_password 

     def clean(self): 
      print "Running clean on a registration form" 
      print self.cleaned_data.items() 
      password = self.cleaned_data['password'] 
      confirm = self.cleaned_data['confirm_password'] 
      if password != confirm: 
       raise forms.ValidationError('Passwords do not match.') 
      return self.cleaned_data 

धन्यवाद!

उत्तर

25

मैंने Django forms.py स्रोत में डाइविंग के बाद त्रुटि के स्रोत की खोज की।

ऐसा लगता है कि यदि कोई क्षेत्र खाली छोड़ दिया गया है, तो फॉर्म field.clean() पर कॉल करने के बाद उस फ़ील्ड के लिए वैलिडेशन एरर उठाता है, लेकिन फिर यह clean_<fieldname> पर कॉल नहीं करता है, लेकिन यह अभी भी कक्षा की मुख्य साफ विधि को कॉल करता है।

def clean(self): 
    try: 
     password = self.cleaned_data['password'] 
     # etc 
    except KeyError: 
     raise ValidationError('The password field was blank.') 

    return self.cleaned_data 
+6

+1 forms.py की खुदाई के लिए। यह मुझे आश्चर्यचकित करता है कि लोग उपलब्ध स्रोत कोड में कैसे नहीं देखेंगे। – cethegeek

+1

यह डरावना हो सकता है। मैं गलती से कुछ महत्वपूर्ण बदलने और सहेजने से डरता हूं। क्रांतिकारी, मुझे पता है कि पूरी चीज को आसानी से बदला जा सकता है। ;-) – SapphireSun

7

आप अपने क्षेत्र कंस्ट्रक्टर्स में required=False का उपयोग करके इस ओवरराइड कर सकते हैं: एक साफ विधि उन रिक्त फ़ील्ड का उपयोग करता है के साथ सौदा करने में आप निम्न क्या करना है।

username = forms.CharField(max_length=30, required=False) 
password = forms.CharField(max_length=30,widget=forms.PasswordInput, required=False) 

यह आपके उदाहरण के लिए विसंगत लगता है, लेकिन उपयोगी हो सकता है अगर अन्य उदाहरण