Question: I'm currently using the default `EmailField` attribute on my form. The issue I'm running into is that the form considers an invalid email such as `name@mail.56` to be valid. Do I need to implement my own `validators` on this field to make it work correctly?

I was under the impression that having:

```
#models.py
email = models.EmailField(max_length=254, blank=False, unique=True,
        error_messages={'required': 'Please provide your email address.',
                        'unique': 'An account with this email exist.'},)

```

Or having:

```
#forms.py
email = forms.EmailField()

```

will take care of this type of validation for me but it doesn't seem so.

Answer: 
You can see the used regex [here](https://github.com/django/django/blob/1.5.1/django/core/validators.py#L81).

I think it doesn't discard 100% of the wrong emails. That's why in the [docs](https://docs.djangoproject.com/en/dev/ref/forms/fields/#emailfield) it says:

> 
> Validates that the given value is a valid email address, using a
>  moderately complex regular expression.
> 
> 
> 

What I understand from this is that it doesn't do a perfect validation due to a design decision (it would be a performance trade-off).

Finally, I'm pretty sure that your example `name@mail.56` **is a valid email**. The domain part of an email address can be an IP (both IPv4 and IPv6) or a hostname. See [here](http://en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names) for further info in the subject.
For DB level only validation you will have to call `full_clean` manually.

Three important citations from documentation:

[How validators are run](https://docs.djangoproject.com/en/1.11/ref/validators/#how-validators-are-run)

> 
> See the form validation for more information on how validators are run
>  in forms, and Validating objects for how they’re run in models. Note
>  that validators will not be run automatically when you save a model,
>  but if you are using a ModelForm, it will run your validators on any
>  fields that are included in your form. See the ModelForm documentation
>  for information on how model validation interacts with forms.
> 
> 
> 

[Model.clean\_fields](https://docs.djangoproject.com/en/2.0/ref/models/instances/#django.db.models.Model.clean_fields)

> 
> The second step full\_clean() performs is to call Model.clean(). This
>  method should be overridden to perform custom validation on your
>  model.
> 
> 
> 

[Model.full\_clean](https://docs.djangoproject.com/en/2.0/ref/models/instances/#django.db.models.Model.full_clean)

> 
> Note that full\_clean() will not be called automatically when you call
>  your model’s save() method. You’ll need to call it manually when you
>  want to run one-step model validation for your own manually created
>  models.
> 
> 
> 

```
from django.db import models

class MyTable(models.Model):
    email = models.EmailField(unique=True)

    def save(self, *args, **kwargs):
        super().full_clean()
        super().save(*args, **kwargs)

```