Добавление дополнительного поля в админ для пользовательского пользователя в Django 1.11

У меня есть пользовательская модель пользователя, которая подкласса AbstractUser с добавленным настраиваемым полем.

# model.py
from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    ADM = 'admin'
    MEMBER = 'member'
    ROLE_CH = ((ADM, 'Administrator'), (MEMBER, 'Member'))

    role = models.CharField(max_length=20, choices=ROLE_CH, blank=True)

Эта модель также зарегистрирована как модель аутентификации по умолчанию в settings.py

# settings.py
AUTH_USER_MODEL = "main.CustomUser"

Затем в admin.py Согласно документации, я создаю пользовательскую форму, которая расширяет UserCreationForm и затем зарегистрируйте его для пользовательского пользователя.

# admin.py
from django.contrib import admin
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm.Meta):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('role',)

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)

Тем не менее, это не работает, как ожидалось. Add User форма остается по умолчанию, т.е. только username, password а также password confirmation поля присутствуют. role поле не появляется.

1 ответ

Решение

Использование form атрибут вместо add_form:

class CustomUserAdmin(ModelAdmin):
    form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)

UPD

Первый ответ правильный только для ModelAdmin базовый класс, так как он не имеет add_form приписывать.

За UserAdmin вы должны обновить add_fieldsets атрибут:

class CustomUserAdmin(UserAdmin):
    add_fieldsets = UserAdmin.add_fieldsets + (
        (None, {
            'fields': ('role',),
        }),
    )

admin.site.register(CustomUser, CustomUserAdmin)

В этом случае вы даже не требуется add_form,

Другие вопросы по тегам