对于django管理员,如何在用户模型中添加字段并在管理员中对其进行编辑?

Sil*_*eed 9 django django-admin

我试图更好地理解django管理员,同时,我正在尝试向当前用户管理员添加一个字段.在models.py我做过

User.add_to_class('new_field', models.BooleanField(default=False))
Run Code Online (Sandbox Code Playgroud)

在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')
Run Code Online (Sandbox Code Playgroud)

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

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

我看过UserChangeForm,但看起来它已经正确地将User作为模型.我不确定new_field表格中缺少原因.

谢谢

关于这是臭臭的代码

我知道这是一个臭臭的猴子修补方式去做这个,但是子类化给我的问题主要是出于这些原因..如果我能按照上面说明的方式让它工作,我会很开心..也许很臭.

关于推荐的方式

我所知道的创建用户配置文件的推荐方式,只是在特定情况下,我看不到的优点创造一个全新的表,具有附加调用数据库的时候我要的存储是一个额外的一些信息,如is_private某些信息.如果我存储更多信息,那么我同意,建立用户配置文件更可取.

ans*_*ung 19

首先是"插入电源吗?" 问题 - 您是否手动将new_field添加到数据库中的users表中?当然,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',)
Run Code Online (Sandbox Code Playgroud)

  • 当我使用:UserAdmin.list_display + =('nickname',)UserAdmin.list_filter + =('nickname',)UserAdmin.fieldsets + =('nickname',)<----->有什么不对,比如说这个:<class'django.contrib.auth.admin.UserAdmin'> :( admin.E008)'fieldsets [4]'的值必须是列表或元组.<----->和我改为:UserAdmin.list_display + =('nickname',)UserAdmin.list_filter + =('nickname',)UserAdmin.fieldsets + =(('nickname',{'fields': ('昵称',)}),)<----->这个问题消失了. (6认同)

Mar*_*ano 6

刚刚弄清楚这一点,也许这也可以帮助你。

由于您没有提及您有单独的个人资料,因此如果您只想向现有用户管理添加一列,则可以在中执行以下操作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
Run Code Online (Sandbox Code Playgroud)

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

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
Run Code Online (Sandbox Code Playgroud)