在 Django 1.11 中为自定义用户在管理员中添加额外字段

Adding extra field in admin for custom user in 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 中,根据 documentation,我创建了一个扩展 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 形式仍然是默认形式,即只有 usernamepasswordpassword confirmation 字段存在。 role 字段未出现。

使用 form 属性代替 add_form:

class CustomUserAdmin(ModelAdmin):
    form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)

UPD

第一个答案仅对 ModelAdmin 基础 class 正确,因为它没有 add_form 属性。

对于 UserAdmin 你应该更新 add_fieldsets 属性:

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

admin.site.register(CustomUser, CustomUserAdmin)

在这种情况下,您甚至不需要 add_form