Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Custom form validation

I have a pretty simple form:

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.") 

Is this how custom form validation is done? I need to evaluate on email that no users currently exist with that email address. I also need to evaluate that password and password_repeat match. How can I go about doing this?

like image 467
Naftuli Kay Avatar asked Oct 30 '11 23:10

Naftuli Kay


People also ask

What is a custom validation?

The CustomValidator control is a separate control from the input control it validates, which allows you to control where the validation message is displayed. Validation controls always perform validation on the server.

What is custom validation in Angular?

A validator in Angular is a function which returns null if a control is valid or an error object if it's invalid. For model-driven forms we create custom validation functions and pass them into the FormControl constructor.

How do I create a custom validation in HTML?

The setCustomValidity method allows you to set a custom text by changeing the validationMessage property of the DOM node that contains the message. When the input is checked by checkValidity method on a form element node, and found to be invalid, the invalid event is fired for the node.


1 Answers

To validate a single field on it's own you can use a clean_FIELDNAME() method in your form, so for email:

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

then for co-dependant fields that rely on each other, you can overwrite the forms clean() method which is run after all the fields (like email above) have been validated individually:

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 

I'm not sure where you got clean_message() from, but that looks like it is a validation method made for a message field which doesn't seem to exist in your form.

Have a read through this for more details:

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

like image 108
Timmy O'Mahony Avatar answered Nov 12 '22 22:11

Timmy O'Mahony