gpt4 book ai didi

django - 在 Django 1.5 自定义用户模型中使用电子邮件作为用户名字段会导致 FieldError

转载 作者:行者123 更新时间:2023-12-03 11:32:46 25 4
gpt4 key购买 nike

我想使用电子邮件字段作为我的自定义用户模型的用户名字段。
我有以下自定义用户模型子类化 Django 的 AbstractUser 模型:

class CustomUser(AbstractUser):
....
email = models.EmailField(max_length=255, unique=True)

USERNAME_FIELD = 'email'

但是当我跑

python manage.py sql myapp



我收到以下错误:

FieldError: Local field 'email' in class 'CustomUser' clashes with field of similar name from base class 'AbstractUser'



我首先包含我自己的电子邮件字段的原因是添加 unique=True选择它。否则我得到:

myapp.customuser: The USERNAME_FIELD must be unique. Add unique=True to the field parameters.



现在,关于这一点:
https://docs.djangoproject.com/en/1.5/topics/db/models/#field-name-hiding-is-not-permitted
如何 可以 我实现了这个? (然后将字段命名为“user_email”或类似的名称)

最佳答案

伊恩,非常感谢你的聪明回应:)

但是,我已经“修补”了一个解决方案。

AbstractUser还有一个username对我来说完全不需要的领域
我决定创建我的“自己的”AbstractUser .

通过子类化 AbstractBaseUserPermissionsMixin我保留了大部分 User 模型内置方法,而没有添加任何代码。

我还利用这个机会创建了一个自定义 Manager消除 username 中的使用一起字段:

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager

class CustomUser(AbstractBaseUser, PermissionsMixin):
....
email = models.EmailField(max_length=255, unique=True)
first_name = ...
last_name = ...
is_active = ...
is_staff = ...
....

objects = CustomUserManager()

USERNAME_FIELD = 'email'


class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
.....

def create_superuser(self, email, password, **extra_fields):
.....

此解决方案确实会导致重复一些 Django 的内置代码(主要是已经存在于 AbstractUser 中的模型字段,例如“first_name”、“last_name”等),但也会导致更清晰的 User 对象和数据库表。

1.5 灵活引入 USERNAME_FIELD 真是可惜了不能用 实际在所有现有约束下创建灵活的用户模型。

编辑:官方文档中有一个全面的工作示例: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#a-full-example

关于django - 在 Django 1.5 自定义用户模型中使用电子邮件作为用户名字段会导致 FieldError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15597188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com