猿问

Django 管理员在 UserAdmin 中排除

目前我有这个用户代理模型:


class UserProxy(User):


    class Meta:

        verbose_name = 'Staff'

        verbose_name_plural = 'Staffs'

        proxy = True

在管理员方面,我有以下管理员:


class StaffAdmin(UserAdmin):

    def get_queryset(self, request):

        qs = super(StaffAdmin, self).get_queryset(request)

        return qs.filter(is_staff=True)


    exclude = ('first_name', 'last_name',)


    def save_model(self, request, obj, form, change):

        if request.user.is_superuser:

            obj.is_staff = True

            obj.save()

admin.site.register(UserProxy, StaffAdmin)

当我在管理员上使用任何形式的代理模型时,它会返回以下错误:


“在‘UserProxyForm’中找不到键‘first_name’。选项有:date_joined、email、groups、is_active、is_staff、is_superuser、last_login、password、user_permissions、username。”


我认为这很奇怪,我试图只排除is_staff,现在它返回:


“在‘UserProxyForm’中找不到键‘is_staff’。选项有:date_joined、email、first_name、groups、is_active、is_superuser、last_login、last_name、password、user_permissions、username。”


为什么会这样?代理模型不应该包含基本模型中的所有字段吗?


翻阅古今
浏览 65回答 1
1回答

慕尼黑的夜晚无繁华

在阅读了 django UserAdmin 类https://github.com/django/django/blob/master/django/contrib/auth/admin.py#L45似乎 UserAdmin 使用字段集并且不使用排除,我将 StaffAdmin 重写为:class StaffAdmin(UserAdmin):    def get_queryset(self, request):        qs = super(StaffAdmin, self).get_queryset(request)        return qs.filter(is_staff=True)    list_display = ('username', 'email', 'is_staff')    search_fields = ('username', 'email')    fieldsets = (        (None, {'fields': ('username', 'password')}),        (_('Personal info'), {'fields': ('email',)}),        (_('Permissions'), {            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups'),        }),        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),    )    add_fieldsets = (        (None, {            'classes': ('wide',),            'fields': ('username', 'email', 'password1', 'password2', ),        }),    )    def save_model(self, request, obj, form, change):        if request.user.is_superuser:            obj.is_staff = True            obj.save()admin.site.register(UserProxy, StaffAdmin)现在我可以定义需要显示哪些字段
随时随地看视频慕课网APP

相关分类

Python
我要回答