【问题标题】:For the django admin, how do I add a field to the User model and have it editable in the admin?对于 django 管理员,如何将字段添加到 User 模型并使其在管理员中可编辑?
【发布时间】:2022-03-15 21:43:59
【问题描述】:

我正在尝试更好地了解 django 管理员,同时,我正在尝试向当前用户管理员添加一个字段。在models.py中我已经完成了

User.add_to_class('new_field', models.BooleanField(default=False))

在 admin.py 中我有以下内容(字段集基本上只是从 django/contrib/auth/admin.py 复制的)

class AdjUserAdmin(UserAdmin):
  list_display  = UserAdmin.list_display + ('new_field',)
  list_filter   = UserAdmin.list_filter + ('new_field',)

  fieldsets = UserAdmin.fieldsets
  fieldsets[1][1]['fields'] = ('first_name','last_name','email','new_field')

问题是,当我这样做时,我得到了错误:

AdjUserAdmin.fieldsets[4][1]['fields']' refers to field 'new_field' that is missing from the form.

我查看了 UserChangeForm,但看起来它已经正确地将 User 作为模型。我不确定为什么表单中缺少new_field

谢谢

关于这是臭代码

我知道这是一种很臭的猴子修补方式,但是子类化给我带来的问题主要是因为these 的原因.. 如果我能让它按照上述方式工作,我会很高兴..可能还很臭。

关于推荐方式

我知道创建用户配置文件的推荐方法,只是在特定情况下,我看不到创建一个全新的表并在我想要存储所有内容时额外调用数据库的优点是一些额外的信息,例如is_private 或类似的信息。如果我要存储更多信息,那么我同意,最好设置用户个人资料。

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    首先是“它是否已插入?”问题——您是否手动将 new_field 添加到数据库中的用户表中?当然,Syncdb 不会处理这个问题。

    之后,我会尝试将这些字段附加到现有的 UserAdmin 上,而不是从头开始重建它:

    from django.contrib.auth.admin import UserAdmin
    
    UserAdmin.list_display += ('new_field',)  # don't forget the commas
    UserAdmin.list_filter += ('new_field',)
    UserAdmin.fieldsets += ('new_field',)
    

    【讨论】:

    • 嗯.. 不知道为什么我在使用 list_display = UserAdmin.list_display + ('new_field',) 后没有想到这一点。谢谢!
    • 当我使用:UserAdmin.list_display += ('nickname',) UserAdmin.list_filter += ('nickname',) UserAdmin.fieldsets += ('nickname',) 有问题,像这样:: (admin.E008) 'fieldsets[4]' 的值必须是一个列表或元组。 我改为: UserAdmin.list_display += ('nickname',) UserAdmin.list_filter += ('nickname',) UserAdmin.fieldsets += (('nickname', {'fields': ('nickname',)}),) 这个问题已经解决了。
    • @bovenson 你可以这样做 UserAdmin.fieldsets += (('Extra Fields', {'fields': ('new_field', )}),)
    【解决方案2】:

    刚刚想通了,也许这对你也有帮助。

    由于您没有提及您有单独的个人资料,因此如果您只想向现有用户管理员添加一列,您可以在admin.py 中执行以下操作:

    首先,您通过子类化UserAdmin 创建一个自定义管理员:

    class CustomUserAdmin(UserAdmin):
        list_display = UserAdmin.list_display + ('is_complete',)
    
        def is_complete(self, obj):
            # Example here, you can use any expression.
            return SomeOtherClass.objects.get(my_field=obj).is_complete()
    
        # Not required, but this gives you a nice boolean field:
        is_complete.boolean = True
    

    然后注销现有的UserAdmin 并注册您自己的:

    admin.site.unregister(User)
    admin.site.register(User, CustomUserAdmin)
    

    【讨论】:

      【解决方案3】:

      最好编写自己的用户配置文件类,并将其附加到用户模型。然后您可以使用get_profile() 方法从用户那里检索配置文件。

      从内联管理员子类化配置文件管理员还应该允许您在用户页面上编辑配置文件,这几乎是您想要做的。

      这篇文章在这个问题上写得非常好:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

      【讨论】:

        【解决方案4】:

        尽管您的数据库查找了对拥有 UserProfile 的担忧,但这确实是您应该解决此问题的方法。这主要有两个原因:

        1. 用户模型与 Django 的身份验证系统和许多其他插件紧密耦合。猴子修补它不是一个好主意。

        2. Django 内置了对创建用户配置文件的支持,许多扩展知道如何很好地使用这些。通过使用用户配置文件(有关这方面的主要讨论,请参阅 http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users),您可以从中受益。

        如果您希望为用户的管理界面添加功能,那么此注释可能会有所帮助:

        http://www.thenestedfloat.com/articles/displaying-custom-user-profile-fields-in-djangos-admin/index.html

        问候,

        伊恩

        【讨论】:

          【解决方案5】:

          根据@anschauung 的回复,在 Django 3.2 中对我有用的是:

          from django.contrib.auth.admin import UserAdmin
          
          # don't forget the commas
          UserAdmin.list_filter += ('new_field',)
          UserAdmin.fieldsets +=  (('Extra Fields', {'fields': ('new_field', )}),)
          

          【讨论】:

            【解决方案6】:

            我收到“表单缺失”错误,发现这是由于我的字段在模型中被标记为“editable=False”。

            【讨论】:

              猜你喜欢
              • 2012-07-18
              • 2019-03-13
              • 2018-08-22
              • 2014-01-12
              • 2016-08-26
              • 1970-01-01
              • 1970-01-01
              • 2013-03-12
              • 2021-12-11
              相关资源
              最近更新 更多