Adding validation to Django User form
Question: I'd like to customize the user sign-up form in Django/Mezzanine to allow only
certain email addresses, so I tried to monkey-patch as follows:

    
    
    # Monkey-patch Mezzanine's user email address check to allow only
    # email addresses at @example.com.
    from django.forms import ValidationError
    from django.utils.translation import ugettext
    from mezzanine.accounts.forms import ProfileForm
    from copy import deepcopy
    original_clean_email = deepcopy(ProfileForm.clean_email)
    def clean_email(self):
        email = self.cleaned_data.get("email")
        if not email.endswith('@example.com'):
            raise ValidationError(
                ugettext("Please enter a valid example.com email address"))
        return original_clean_email(self)
    ProfileForm.clean_email = clean_email
    

This code is added at the top of one of my `models.py`.

However, when I runserver I get the dreaded

    
    
    django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.
    

If I add

    
    
    import django
    django.setup()
    

then `python manage.py runserver` just hangs until I `^C`.

What should I be doing to add this functionality?


Answer: Create a file `myapp/apps.py` for one of your apps (I've use `myapp` here),
and define an app config class that does the monkeypatching in the `ready()`
method.

    
    
    from django.apps import AppConfig
    
    class MyAppConfig(AppConfig):
        name = 'myapp'
    
        def ready(self):
            # do the imports and define clean_email here
            ProfileForm.clean_email = clean_email
    

Then use `'myapp.apps.MyAppConfig'` instead of `'myapp'` in your
`INSTALLED_APPS` setting.

    
    
    INSTALLED_APPS = [
        ...
        'myapp.apps.MyAppConfig',
        ...
    ]
    

You might need to put Mezzanine above the app config for it to work.

