2009-12-09 17 views
7

Bir formu doğrulamaya çalışıyorum (ve daha önce çalışmıştı). Bazı nedenlerden dolayı, clean_username (self) gibi çeşitli temizleme işlevlerini form.is_valid() çağrılırken çağırmak gibi görünmüyor. Neredeyse yeterli kontroller değildir haniDjango form aramıyor clean_ <fieldname>

henüz (onlar ;-) bkz yapım aşamasında olan), ama burada benim sınıfları şunlardır:

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 

teşekkür ederiz!

cevap

25

Django forms.py kaynağına dolduktan sonra hatanın kaynağını keşfettim.

Bir alan boş bırakılırsa, form field.clean() numaralı telefonu aradıktan sonra bu alan için bir ValidationError yükseltir, ancak clean_<fieldname> numaralı telefonu çağırmaz, ancak yine de sınıfın ana temiz yöntemini çağırır.

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. İnsanların mevcut kaynak koduna nasıl bakmayacağı beni şaşırtıyor. – cethegeek

+1

Bu korkutucu olabilir. Ben yanlışlıkla değişen ve önemli bir şey kaydetmekten korkuyorum. İrrasyonel, her şeyin kolayca değiştirilebileceğini biliyorum. ;-) – SapphireSun

7

Sen saha kurucularınızdaki required=False kullanarak bu geçersiz kılabilirsiniz: bu boş alanları kullanan temiz yöntemle başa çıkabilmek için aşağıdakileri yapmanız gerekir.

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

Bu örneğin mantıksız görünüyor, ama yararlı olabilir eğer diğer örnekleri forms.py içine kazma

İlgili konular