Use django regex to validate email addresses #256
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Background
Django's email validation is much stricter than Angular's. In particular, Angular allows any domain, including those without a tld:
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 theEmailFieldMixin
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 theemail-pattern
attribute. If thevalidate-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:Caveats
-
character using a negative lookbehind. Javascript regexes do not support lookbehinds, so this is stripped.