密码字段在 Django 管理站点中可见且未加密

Omi*_*aee 3 python django django-models django-admin

因此,要使用电子邮件作为用户名,我会像这样重写内置User模型(受到Django 源代码的启发)

模型.py

class User(AbstractUser):
    username = None
    email = models.EmailField(unique=True)
    objects = UserManager()
    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    def __str__(self):
        return self.email
Run Code Online (Sandbox Code Playgroud)

管理员.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",)
Run Code Online (Sandbox Code Playgroud)

但这就是我进入管理站点更改用户时的样子:

在此输入图像描述

密码可见且未经过哈希处理,并且没有更改密码表单的链接。

与默认 Django 项目相比:

在此输入图像描述

密码不可见,有一个更改密码表单的链接

很明显我错过了一些东西,但我不知道它是什么。

Gon*_*ica 6

Django Admin 外观问题可能与继承有关。更准确地说,将类更改为继承自UserAdmin.

from django.contrib.auth.admin import UserAdmin as DefaultUserAdmin

class UserAdmin(DefaultUserAdmin):
Run Code Online (Sandbox Code Playgroud)

这样做会使其看起来更接近默认的 Django 项目。


密码未加密的问题很可能是因为数据库中未加密。OP 有这个问题,这不是 Django 管理员的问题。


笔记:

  • AbstractUser当我想删除时我也会使用username

  • 由于当前的问题没有足够的信息来回答 pwd 被散列的问题,因此我将其留给OP的其他问题