为什么在 django admin 中重置密码之前我不能登录任何帐户?

why can't I log in into any account until I reset its password in django admin?

我有一个与 django.contrib.auth.models 中的用户模型具有一对一关系的配置文件模型,当我从管理面板添加新配置文件时,我注意到密码字段没有转换为点打字,它显示实际密码,但这不是问题,问题是,每当我创建一个新的配置文件,该配置文件又创建一个新用户,并将 is staff 属性标记为 true 时,我无法登录使用该创建的帐户管理面板,除非我使用

手动重置密码

python manage.py changepassword the-user-name

重置密码后,即使密码相同,我也可以正常登录账户,请问有人知道为什么会这样吗? 我确保输入密码没有错误,并尝试了几次,直到我确定这是实际发生的事情

更新

当我从身份验证和授权部分输入用户模型而不是从应用程序名称输入时,我发现除了密码部分还写了

Invalid password format or unknown hashing algorithm

我该如何解决?

我忘了说我正在使用通用视图中的 UpdateView,并使用模型配置文件作为该视图上设置的模型属性

我的更新视图的代码

class ProfileUpdate(UpdateView):
    model = Profile
    fields= [
        'username',
        'bio',
        'avatar_thumbnail',
        'location',
        'tags',
        'contact_information'
        ]
    def get_object(self):
        return Profile.objects.get(pk = self.kwargs.get('user_pk'))

    def get_queryset(self):
        base_qs = super(ProfileUpdate, self).get_queryset()
        return base_qs.filter(username=self.request.user.username)

这将从您的 admin.py 中的 ModelAdmin 而不是 UserAdmin 继承。

你能试试这个吗:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from app.models import Profile

class ProfileAdmin(UserAdmin):

   def __init__(self, *args, **kwargs):
      super(UserAdmin,self).__init__(*args, **kwargs)
      UserAdmin.fieldsets += (('profile', {'fields': ('attr1', 'attr2')}),)

admin.site.unregister(User)    
admin.site.register(Profile, ProfileAdmin)

说明

当您像这样注册 Profile 管理员时,admin.site.register(models.Profile),在内部它是从 ModelAdmin class 继承的,这对所有其他 class 来说是完美的es。但是对于 User 我们需要散列来保存 passwrd 字段,所以必须继承一个单独的 class UserAdmin。

继承后,密码问题就解决了,但由于基本模型是 UserAdmin,所以只显示与用户相关的字段。我们需要附加配置文件字段,我们为其添加了 __init__ 方法并将配置文件字段附加到管理部分。