Again, I'm not sure, but I think to do it at Model validation level you'd have to modify some of the django core files themselve. I think what you're looking for is in django.core.validators (in my install this file is at /lib/python2.7/site-packages/django/core/validators.py, or you can just search for validators.py on your system) But I've had my own troubles that I thought I could solve by modifying the django files themselves (and it works), but everyone that helped me advised that this is not the best way to do it, because future updates of django itself will break your changes.
from django.shortcuts import render
from django.http import HttpResponseRedirect
def your_form_handling_view(request):
if request.method == 'POST': # If the form has been submitted...
form = YourForm(request.POST) # A form that you created in your forms.py
if form.is_valid(): # All validation rules pass
# Process the data in form.cleaned_data...get all the fields that require further validation
your_multipleemail_field = form.cleaned_data['your_multipleemail_field']
#.... perform the extra validation here, for example
extra_validation_passes = True
for email in your_multipleemail_field.split(','):
if email_id_exists(email) and not(validateEmail(email)): #assuming some_field is the email id and email_id_exists() is your function that validates it
#Create your custom errors here
form.your_multipleemail_field.errors = "Email id already exists in LDAP or is invalid"
extra_validation_passes = False
if extra_validation_passes:
return HttpResponseRedirect('/thanks/') # Redirect after POST
return render(request, 'template_with_your_form_on_it.html', {'form': form,}) #Now this form goes back to the template with your custom errors.
else:
form = YourForm() # An unbound form
return render(request, 'template_with_your_form_on_it.html', {'form': form,})
This is a separate global function you might want to put somewhere other than views.py (maybe models.py, but don't forget to import it in views.py if you do this)
def validateEmail( email ):
from django.core.validators import validate_email
from django.core.exceptions import ValidationError
try:
validate_email( email )
return True
except ValidationError:
return False
Again, not sure if this works, I've never added custom errors to a form like this, but I think forms are normal objects and if the .errors are just strings, I don't see why it wouldn't work. In fact it probably doesn't work but it might give you some ideas. Of course, you could split the conditional "if email_id_exists(email) and not(validateEmail(email)):" to test them separately to give more precise error messages.
Hope that helps.
On Friday, November 2, 2012 4:36:20 AM UTC-4, Dilip M wrote:
Hi,
I am new to Django. Went through docs before posting this.. I have a model and form like this.
models.py:
class Recipients(models.Model):
dev = models.EmailField()
qa = models.EmailField()
cc = models.MultipleEmailField()
forms.py:
class RecipientsForm(forms.ModelForm):
class Meta:
model = Recipients
Now I want to,
1. Add *additional* validation for models.EmailField(). Something like check if email id entered exists in LDAP db.
2. Create new model custom field MultipleEmailField(), which would split emails separated by comma and uses modified validation of models.EmailField() done in step 1.
I am going through docs, but not able to figure out how to put things together! Here is what I understood.
MultipleEmailField() should go in <project-name>/fields.py. But how to make it to run default validation of models.EmailField() and than do custom validation?
Any help appreciated..