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

时间:2018-05-29 11:21:18

标签: 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)

此模型也在settings.py

中注册为默认身份验证模型
# settings.py
AUTH_USER_MODEL = "main.CustomUser"

然后根据documentationadmin.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表单仍然是默认表单,即仅存在usernamepasswordpassword confirmation字段。 role字段未显示。

1 个答案:

答案 0 :(得分:3)

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