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

7
我有一个自定义用户模型,它是通过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)

然而,它并没有像预期的那样起作用。"添加用户"表单仍然是默认的,即只有"用户名"、"密码"和"确认密码"字段。"角色"字段不会出现。
1个回答

8

使用 form 属性代替 add_form:

class CustomUserAdmin(ModelAdmin):
    form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)

更新

第一个答案只适用于ModelAdmin基类,因为它没有add_form属性。

对于UserAdmin,您应该更新add_fieldsets属性:

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

admin.site.register(CustomUser, CustomUserAdmin)

在这种情况下,你甚至不需要使用add_form

请问您能否详细说明一下?根据文档,add_form 应该用于添加用户,而 form 则用于编辑用户。此外,我尝试过更改它,但表单并没有发生变化。 - Demetris
@Demetris 抱歉错过了你正在使用 UserAdmin。请查看更新的答案。您还需要设置 add_fieldsets - neverwalkaloner
add_fieldsets 对我不起作用,只设置 fieldsets 就行了。之间发生了什么变化吗? - seb
1
@seb 可能你没有使用 UserAdminadd_fieldsets 仅适用于 UserAdmin 类。 - neverwalkaloner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接