2011-10-30 16 views
29

que tiene una forma bastante simple:personalizada validación de formularios

from django import forms 

class InitialSignupForm(forms.Form): 
    email = forms.EmailField() 
    password = forms.CharField(max_length=255, widget = forms.PasswordInput) 
    password_repeat = forms.CharField(max_length=255, widget = forms.PasswordInput) 

    def clean_message(self): 
     email = self.clean_data.get('email', '') 
     password = self.clean_data.get('password', '') 
     password_repeat = self.clean_data.get('password_repeat', '') 

     try: 
      User.objects.get(email_address = email) 
      raise forms.ValidationError("Email taken.") 
     except User.DoesNotExist: 
      pass 

     if password != password_repeat: 
      raise forms.ValidationError("The passwords don't match.") 

¿Es así como la validación de formularios a medida que se hace? Necesito evaluar en email que actualmente no existen usuarios con esa dirección de correo electrónico. También necesito evaluar que coincidan password y password_repeat. ¿Cómo puedo hacer esto?

+0

prefiero hacer la validación en mothel más que en las formas: http://beutil.blogspot.com/2011/10/django-moving- business-rules-from-views.html – danihp

Respuesta

83

Para validar un campo único en su propio puede utilizar un método clean_FIELDNAME() en su forma, por lo que para el correo electrónico:

def clean_email(self): 
    email = self.cleaned_data['email'] 
    if User.objects.filter(email=email).exists(): 
     raise ValidationError("Email already exists") 
    return email 

continuación, para los campos de co-dependientes que dependen el uno del otro, puede sobrescribir las formas clean() método que se ejecuta después de todos los campos (como email arriba) han sido validados de forma individual:

def clean(self): 
    form_data = self.cleaned_data 
    if form_data['password'] != form_data['password_repeat']: 
     self._errors["password"] = ["Password do not match"] # Will raise a error message 
     del form_data['password'] 
    return form_data 

no estoy seguro de dónde sacó de clean_message(), pero que parece que es un método de validación realizado por un message campo que no parece existir en su forma.

tener una lectura a través de este para más detalles:

https://docs.djangoproject.com/en/dev/ref/forms/validation/

+4

solo un pequeño aviso ... 'form_data ['password']! = form_data ['password']' probabbly debería haber algo como 'password2' para el campo con contraseña repeat ... – andi

+0

Ya ... Debería ser: form_data ['password']! = Form_data ['password_repeat'] – pavanw3b

+0

He cambiado uno a 'password_repeat', gracias! –

Cuestiones relacionadas