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?
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.
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.
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.
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With