我可以在不创建自定义用户的情况下更改 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 中不需要的管理字段吗?

如何使用自定义 django 404 错误视图重定向?

在不删除表的情况下更改模型中的 Django 数据类型

Django 用户在创建/权限提升方面的权利

在不使用 Django 本身的情况下测试自定义 Django 中间件

ASP.NET MVC:在不影响性能的情况下路由自定义 slug