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

时间:2009-06-30 00:54:03

标签: django django-admin

我正在尝试更好地理解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或其他一些信息。如果我存储了更多信息,那么我同意,最好设置一个用户配置文件。

5 个答案:

答案 0 :(得分:17)

首先是“插上电源吗?”问题 - 您是否手动将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',)

答案 1 :(得分:4)

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

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

这篇文章对这个问题有一个非常好的写作:http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

答案 2 :(得分:2)

尽管你的DB担心有UserProfile,但这确实是你应该解决这个问题的方法。这有两个主要原因:

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

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

  3. 如果您要为用户添加管理界面的功能,则此注释可能会有所帮助:

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

    此致

    伊恩

答案 3 :(得分: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)

答案 4 :(得分:0)

我得到了'表单中缺少的'错误,并发现这是因为我的字段在模型中被标记为'editable = False'。