【问题标题】:Django: Make user email requiredDjango:使用户电子邮件成为必需
【发布时间】:2018-03-06 15:47:12
【问题描述】:

对于我的应用程序,用户的电子邮件字段应该是必需的。默认用户模型不是这种情况。所以我认为按照docs 中的描述创建自定义用户模型是有意义的:

如果您要开始一个新项目,强烈建议您设置一个 自定义用户模型,即使默认用户模型足以 你。此模型的行为与默认用户模型相同,但 如果需要,您将来可以对其进行自定义:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    email = models.EmailField(_('email address'), blank=False)

但是,我不确定这是否是实现这一目标的正确方法。

原因是here Django 文档说:

抽象基类在你想把一些常见的 信息转化为许多其他模型。你写你的基类 并将 abstract=True 放在 Meta 类中。那么这个模型就不会 用于创建任何数据库表。相反,当它被用作基础时 其他模型的类,其字段将添加到子模型的字段中 班级。 在抽象基类中有字段是错误的 与孩子同名(Django 会提出一个 例外)。

我现在该怎么办?

【问题讨论】:

    标签: python django


    【解决方案1】:

    我必须回答我的问题,因为现在我知道了解决方案:

    我在开始帖子中描述的方式应该有效。文档是错误的: https://code.djangoproject.com/ticket/29192

    【讨论】:

    • 您应该接受自己的答案,因为这是正确的答案。我假设 Django 的文档是正确的。在以前版本的 Django 中,您无法覆盖 ModelFields 属性。
    【解决方案2】:

    在models.py中添加

    from django.contrib.auth.models import User
    
    User._meta.get_field('email')._unique = True
    User._meta.get_field('email').blank = False
    User._meta.get_field('email').null = False
    

    【讨论】:

    • 此更改需要迁移,迁移将在虚拟 env 目录中创建,该目录不包含在 git 存储库中。你知道有什么解决办法吗?
    【解决方案3】:

    编辑:您必须继承 AbstractBaseUser 并实现所有其他属性。

    from django.contrib.auth.models import AbstractBaseUser, UserManager
    
    class User(AbstractBaseUser):
        email = models.EmailField(_('email address'), blank=False)       
        objects = UserManager()
    

    第二次编辑:

    Aliquis 的答案是正确的。当前文档只是wrong:“抽象基类中的字段与子类中的字段同名是错误的(Django 会引发异常)。”

    【讨论】:

    • 看起来这也不是一个解决方案。 > REQUIRED_FIELDS 在 Django 的其他部分没有影响,比如在 admin 中创建用户。 docs.djangoproject.com/en/2.0/topics/auth/customizing/…
    • 我已重读您的问题。这就是它的方法。但你也必须承担其余的。看看 AbstractUser 的实现。
    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2015-04-27
    • 2019-04-26
    • 2011-09-15
    • 2012-02-18
    • 1970-01-01
    • 2021-05-13
    • 2011-04-02
    相关资源
    最近更新 更多