因此,要使用email作为用户名,我将覆盖内置的User
模型,如下所示(受Django source code启发)
- 型号. py**
class User(AbstractUser):
username = None
email = models.EmailField(unique=True)
objects = UserManager()
USERNAME_FIELD = "email"
REQUIRED_FIELDS = []
def __str__(self):
return self.email
- 管理员py**
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
fieldsets = (
(None, {"fields": ("email", "password")}),
(("Personal info"), {"fields": ("first_name", "last_name")}),
(
("Permissions"),
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"groups",
"user_permissions",
),
},
),
(("Important dates"), {"fields": ("last_login", "date_joined")}),
)
add_fieldsets = (
(
None,
{
"classes": ("wide",),
"fields": ("email", "password1", "password2"),
},
),
)
list_display = ("email", "is_active", "is_staff", "is_superuser")
list_filter = ("is_active", "is_staff", "is_superuser")
search_fields = ("email",)
ordering = ("email",)
filter_horizontal = ("groups", "user_permissions",)
但这是当我去管理员网站更改用户时的样子:
密码可见且未散列,且无更改密码表单链接。
与默认Django项目的外观比较:
密码不可见并且有一个指向更改密码表单的链接
很明显我漏掉了什么但我不知道是什么。
4条答案
按热度按时间ogsagwnx1#
Django Admin外观的问题很可能与继承有关,更准确地说,将类改为从
UserAdmin
继承。这样做会使它看起来更接近默认的Django项目。
密码没有加密的问题很可能是因为它在数据库. OP has this question中没有加密,这不是Django管理员的问题。
username
时,我也使用AbstractUser
。mklgxw1f2#
您无法看到散列状态的密码,因为
password
字段是一个CharField
,它将其呈现为普通文本字段。在Django的管理端,django.contrib.auth.forms
中有一个名为ReadOnlyPasswordHashField的字段,它将密码字段呈现为散列状态,并带有密码更改链接。Django的
UserAdmin
使用不同的表单类来创建和更新用户。要编辑用户详细信息,
UserAdmin
使用form = UserChangeForm
(源代码),其中密码字段设置为ReadOnlyPasswordHashField
(源代码)。因此,只是通过继承
UserAdmin
从django.contrib.auth.admin
将使密码处于散列状态与所有其他要素,如在默认管理网站中看到的用户.或
您可以简单地从
django.contrib.auth.forms
导入UserChangeForm
并在自定义UserAdmin
中设置form = UserChangeForm
w6mmgewl3#
DjangoDocumentation清楚地解释了如何在Django中定制认证
klsxnrf14#
一种方法是在admin.py中为UserAdmin定义一个自定义字段集。