我可以在不创建自定义用户的情况下更改 Django 1.5 中的 USERNAME_FIELD 吗?
Posted
技术标签:
【中文标题】我可以在不创建自定义用户的情况下更改 Django 1.5 中的 USERNAME_FIELD 吗?【英文标题】:Can I change the USERNAME_FIELD in Django 1.5 without creating a custom user? 【发布时间】:2013-03-18 01:57:20 【问题描述】:我正在尝试使用默认 Django 用户模型中的电子邮件字段作为用户名。我正在使用 Django 1.5,我看到默认用户有一个 USERNAME_FIELD
属性。
在我的项目中,我想在用户模型中将以下USERNAME_FIELD = 'email'
设置为默认值。
这个小但基本的调整是我唯一想在用户模型中改变的地方。我想知道是否有一种方法可以更改USERNAME_FIELD
而不必继承AbstractUser
。我在this question 中看到您可以继承AbstractUser
并为其编写自定义管理器。
所以我想知道是否有更简单的方法来更改该属性?
如果没有,扩展AbstractUser
以使用电子邮件字段作为用户名的最小方法是什么?
【问题讨论】:
改用 AbstraceBaseUser @catherine 如果您将 AbstractUser 子类化,您最终会遇到这些问题:***.com/questions/16605453/… 和 ***.com/questions/16601412/… 【参考方案1】:#Your app's __init__.py
from django.contrib.auth.models import User
User.USERNAME_FIELD = 'email'
【讨论】:
这会引发错误“django.core.management.base.CommandError:一个或多个模型未验证:auth.user:名为 USERNAME_FIELD 的字段不应包含在可交换的 REQUIRED_FIELDS 中用户模型。auth.user:USERNAME_FIELD 必须是唯一的。将 unique=True 添加到字段参数中。对我来说。 我也有同样的问题......我想知道在 2013 年 3 月到 13 年 5 月左右之间是否有任何改变打破了这一点。我真的很喜欢这个工作..【参考方案2】:你必须通过扩展 AbstractBaseUser 而不是 AbstractUser 来编写一个新的自定义用户类
在此处将您的电子邮件声明为 USERNAME_FIELD
您还可以选择声明一个从 BaseUserManager 扩展的自定义用户管理器来处理用户名所需的约束。 您可以从该经理的 create_user 函数中删除用户名
【讨论】:
以上是关于我可以在不创建自定义用户的情况下更改 Django 1.5 中的 USERNAME_FIELD 吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在不创建表单的情况下创建 Django 中不需要的管理字段吗?