Django исключение администратора в UserAdmin - PullRequest
0 голосов
/ 11 февраля 2020

В настоящее время у меня есть эта модель прокси пользователя:

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)

Когда я go в любой форме модели прокси на администраторе выдает следующую ошибку:

«Ключ 'first_name” не найден в «UserProxyForm». Возможные варианты: date_joined, email, groups, is_active, is_staff, is_superuser, last_login, пароль, user_permissions, username. "

Я подумал, что это странно, и я пытался исключить только is_staff, и теперь он возвращает:

" Ключ 'is_staff' не находится в «UserProxyForm». Доступны следующие варианты: date_joined, электронная почта, first_name, groups, is_active, is_superuser, last_login, last_name, пароль, user_permissions, username. "

Почему это происходит? Разве в прокси-модели не должно быть всех полей базовой модели?

1 Ответ

1 голос
/ 12 февраля 2020

После прочтения django Класс UserAdmin https://github.com/django/django/blob/master/django/contrib/auth/admin.py#L45

Кажется, что UserAdmin использует наборы полей и не использует exclude, я переписываю свой 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)

А теперь я могу определить, какие поля должны отображаться

...