【问题标题】:Custom user model in django does not allow setting password in admindjango 中的自定义用户模型不允许在管理员中设置密码
【发布时间】:2012-11-19 15:45:19
【问题描述】:

我创建了一个自定义用户模型,并在我的应用程序中成功使用。

问题是在管理员中,在用户编辑屏幕上,我得到了当前密码哈希的显示,而不是用于设置密码的非常有用的界面。

我在 Python 2.7 上使用 Django 1.5b1。

为了管理用户界面,我怎样才能说服 Django 管理员像对待本地用户一样对待我的用户模型?

【问题讨论】:

    标签: python django django-admin django-1.5


    【解决方案1】:

    文档建议您需要向管理员注册自定义模型并定义一些方法,以便管理员界面与自定义用户模型一起使用。

    您可能还必须为用户定义内置表单。

    来自Custom users and django.contrib.admin

    您还需要向管理员注册您的自定义用户模型。如果您的自定义用户模型扩展了 AbstractUser,您可以使用 Django 现有的 UserAdmin 类。但是,如果您的 User 模型扩展了 AbstractBaseUser,则需要定义一个自定义 ModelAdmin 类。

    【讨论】:

    • 成功了!更多细节:我的模型不是基于 UserAdmin,而是看起来、说话、走路(具有相同的字段等等)。我能够注册我自己的自定义模型管理员,这是我以最少的努力和代码重复创建的。我的模型管理员扩展了 django.contrib.auth.admin.UserAdmin 并覆盖了字段集、表单和 add_form。 form 和 add_form 依次指向我的自定义表单,它扩展了 Django 提供的 UserCreationForm 和 UserChangeForm 并覆盖 Meta 子类以指向我的模型。这些东西如何协同工作真是太神奇了!还有,鸭子打字的道具。
    【解决方案2】:

    只需将其添加到您的表单中:

      password = ReadOnlyPasswordHashField(
          label= ("Password"),
          help_text= ("Raw passwords are not stored, so there is no way to see "
                      "this user's password, but you can change the password "
                      "using <a href=\"password/\">this form</a>."))
    

    借自https://stackoverflow.com/a/15630360/780262

    【讨论】:

      【解决方案3】:

      至少在 1.10 中,我能够做到以下几点。比上面的简单。我把它放在 admin.py 中:

      from django.contrib.auth.admin import UserAdmin
      from django.contrib import admin
      from myapp.models import MyUser
      
      class MyUserAdmin(UserAdmin):
          model = MyUser
      
          fieldsets = UserAdmin.fieldsets + (
                  (None, {'fields': ('a_custom_field',)}),
          )
      
      admin.site.register(MyUser, MyUserAdmin)
      

      【讨论】:

        【解决方案4】:

        如果您要扩展 AbstractBaseUser,您将需要两个表单,一个创建表单和一个不带密码的更新表单,从 ModelForm 派生。

        然后在 Admin 表单中,指定单独的创建和更新表单,以及相应的字段集:

        class MyUserAdmin(UserAdmin):
            # The forms to add and change user instances
            form = UserChangeForm
            add_form = UserCreationForm
        
            fieldsets = (
                (None, {'fields': ('email', 'first_name', 'last_name')}),
            )
            add_fieldsets = (
                (None, {'fields': ('email', 'password', 'password2', 'first_name', 'last_name')}),
            )
        

        新用户的密码可以使用。在预定义的 django 表单中而不是在管理员中更改密码。

        【讨论】:

          猜你喜欢
          • 2013-06-01
          • 2015-09-19
          • 2014-07-16
          • 1970-01-01
          • 2013-06-01
          • 2013-03-09
          • 1970-01-01
          • 2018-03-05
          • 2020-11-12
          相关资源
          最近更新 更多