jrief / django-angular

Let AngularJS play well with Django
http://django-angular.awesto.com/
MIT License
1.23k stars 294 forks source link

Use django regex to validate email addresses #256

Closed omarkhan closed 8 years ago

omarkhan commented 8 years ago

Background

Django's email validation is much stricter than Angular's. In particular, Angular allows any domain, including those without a tld:

foo@bar

This can cause the form to validate client-side but fail to validate on the server.

Proposal

Use the same regex as Django to validate email addresses.

Implementation

Django uses a combination of 3 regexes and some custom code to validate email addresses. Rather than try to replicate that logic exactly, I have added a get_email_regex method to the EmailFieldMixin class that concatenates the user and domain regexes (including whitelisted domains) into a single javascript-compatible regex. This regex is then added to the input as the email-pattern attribute. If the validate-email directive is included on the input element, this pattern will be used to validate email addresses instead of the Angular default email validation. For example:

class MyForm(NgFormValidationMixin, NgForm):
    email = forms.EmailField(widget=forms.widgets.EmailInput(attrs={
        'validate-email': True
    }))

Caveats

jrief commented 8 years ago

Thanks for this PR, this annoyed me a little bit myself. Just for curiosity, why do you extract the Regex from the email field instead of hard coding it?

omarkhan commented 8 years ago

Just to keep it DRY.

jrief commented 8 years ago

your PR has been published in https://pypi.python.org/pypi/django-angular/0.8.2

omarkhan commented 8 years ago

Great, thanks for the quick response on this issue!