6

我有一个自定义用户模型,它通过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即 only usernamepassword并且password confirmation存在字段。该role字段不出现。

4

1 回答 1

7

使用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.

于 2018-05-29T11:24:50.263 回答