向 Django 用户表单添加验证

Adding validation to Django User form

我想自定义 Django/Mezzanine 中的用户注册表单以仅允许某些电子邮件地址,因此我尝试按如下方式进行猴子修补:

# 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

此代码添加在我的 models.py 之一的顶部。

然而,当我运行服务器时,我得到了可怕的

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

如果我加上

import django
django.setup()

然后 python manage.py runserver 挂起直到我 ^C.

我应该怎么做才能添加此功能?

为您的一个应用程序创建一个文件 myapp/apps.py(我在这里使用 myapp),并定义一个应用程序配置 class 在 [=14] 中进行猴子修补=]方法。

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

然后在 INSTALLED_APPS 设置中使用 'myapp.apps.MyAppConfig' 而不是 'myapp'

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

您可能需要将 Mezzanine 置于应用配置之上才能正常工作。