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

Dem*_*ris 6 django django-admin django-custom-user

我有一个自定义用户模型,它是由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)
Run Code Online (Sandbox Code Playgroud)

此模型也注册为默认身份验证模型 settings.py

# settings.py
AUTH_USER_MODEL = "main.CustomUser"
Run Code Online (Sandbox Code Playgroud)

然后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)
Run Code Online (Sandbox Code Playgroud)

但是,它没有按预期工作。该Add User窗体保持即只有默认的一个usernamepasswordpassword confirmation字段存在。该role字段不会出现。

nev*_*ner 7

使用form属性代替add_form

class CustomUserAdmin(ModelAdmin):
    form = CustomUserCreationForm

admin.site.register(CustomUser, CustomUserAdmin)
Run Code Online (Sandbox Code Playgroud)

UPD

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

因为UserAdmin你应该更新add_fieldsets属性:

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

admin.site.register(CustomUser, CustomUserAdmin)
Run Code Online (Sandbox Code Playgroud)

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