是否可以覆盖用户模型以使电子邮件字段成为必填字段?

Can the User model be overridden to make the email field required?

对于我的应用程序,Django User model 中的电子邮件字段应该是必需的,但默认情况下它是可选的。

我搜索了这个问题,但我找到的大多数答案都是关于在自定义 UserCreationForm for example:

中设置必填电子邮件字段
class CustomUserForm(UserCreationForm):
    """Provide a view for creating users with only the requisite fields."""

    class Meta:
        model = User
        # Note that password is taken care of for us by auth's UserCreationForm.
        fields = ('username', 'email')

    def __init__(self, *args, **kwargs):
        super(CustomUserForm, self).__init__(*args, **kwargs)
        self.fields['email'].required = True

但我也想在 User 模型中强制使用电子邮件 因为我在想 ModelForm 可能是前端的东西并且是必需的条件可能被用户使用 chrome 开发工具关闭,我错了吗? ModelForm 中要求的电子邮件是否与用户 model 中要求的电子邮件相同, 或者我可以重写用户模型以使电子邮件成为必需的吗?

from django.contrib.auth.models import User
from django.db import models

User.add_to_class('email', models.EmailField(blank=False))



Maybe ModelForm are a frontend thing and the required condition maybe be turned off by the user by using the chrome dev tools, am I wrong?

你是正确的,用户可以使用工具来制作不需要的输入项,事实上你经常可以改变 DOM 从而改变 HTML 形式,或者更简单地制作使用 curl 之类的工具发出 POST 请求,您可以在其中 post 任意数据。

但是 Form(在一定程度上是 ModelForm 而不是 只呈现 HTML 中的表单,它也被使用验证 数据。因此,这意味着如果您使用具有以下内容的视图:

def my_view(request):
    if request.method == 'POST':
        form = CustomUserForm(request.POST, request.FILES)
        if <b>form.is_valid()</b>:
            # …
        # …
    # …

然后 form.is_valid() 将 return False 如果用户没有填写电子邮件地址。因此,表单用于验证、清理数据、在模型中存储数据以及呈现 HTML 表单。

在您的设置文件中

AUTH_USER_MODEL = 'yourapp.User'

在你的模型中

from django.db import models
from django.contrib.auth.models import AbstractUser, Permission, Group
from django.utils.translation import gettext_lazy as _


class User(AbstractUser):
    groups = models.ManyToManyField(
        Group,
        verbose_name=_('groups'),
        blank=True,
        help_text=_(
            'The groups this user belongs to. A user will get all permissions '
            'granted to each of their groups.'
        ),
        related_name="user_groups",
        related_query_name="user",
    )
    user_permissions = models.ManyToManyField(
        Permission,
        verbose_name=_('user permissions'),
        blank=True,
        help_text=_('Specific permissions for this user.'),
        related_name="user_permissions",
        related_query_name="user",
    )

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['email']

    # here you can add new fields and attributes

    class Meta:
        permissions = (
            # here you can add pressiion
        )

在您的管理员中

from custodia.models import User
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _


@admin.register(User)
class UserAdmin(UserAdmin):
    list_display = ('email', 'first_name', 'last_name', 'customer', 'is_staff', 'is_active')
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Aditional info'), {'fields': ('your_new_fields',)}),
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
        }),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )

    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups', 'customer')