Django:自定义用户模型字段未在Django管理界面中显示

12

我正在尝试向django.contrib.auth.models用户模型中添加一些额外的字段。我将在整个项目中使用这个自定义用户模型。我使用了AbstractUser来添加namecontact字段。

class User(AbstractUser):
    name = models.CharField(_('Name of User'), blank=True, max_length=255)
    contact = models.CharField(max_length=20, blank=True)
    def __str__(self):
        return self.username
在我的settings.py文件中,我添加了apps.authentication,这是我的应用程序。
INSTALLED_APPS = [ 'apps.authentication', ...]

我还指定了AUTH_USER_MODEL

AUTH_USER_MODEL = 'authentication.User'

接着我运行了迁移,它成功了(我检查了一下我的本地数据库;新的表被创建了)。但是,当我使用Django管理员访问它时,namecontact字段不见了。如何让这些字段出现?

输入图像描述

3个回答

20

您可以通过在admin.py文件中添加以下内容,将默认的UserAdmin类与自定义字段集连接:

from django.contrib.auth.admin import UserAdmin

UserAdmin.fieldsets += ('Custom fields set', {'fields': ('name', 'contact')}),

1
你知道如何将这些字段添加到“个人信息”部分吗?我想把它们放在那里。 - Donovan Keating
1
@DonovanKeating 由于fieldsets是不可变的,我建议你最好完全覆盖默认的fieldsets,像这样:UserAdmin.fieldsets = ( (None, {'fields': ('username', 'password')}), (_('个人信息'), {'fields': ('first_name', 'last_name', 'email', 'name', 'contact')}), (_('权限'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}), (_('重要日期'), {'fields': ('last_login',)}), - neverwalkaloner
哦,谢谢!只是好奇,那些元组看起来像(_('Important dates')中的下划线是什么意思? - Donovan Keating
2
@DonovanKeating 这是一个翻译工具,它可以使以下代码中的字符串“个人信息” _('Personal info') 多语言化。您需要像这样导入它:from django.utils.translation import ugettext_lazy as __ 只是常用的同义词。有关更多详细信息,请查看文档的相关部分:https://docs.djangoproject.com/en/2.0/topics/i18n/translation/。 - neverwalkaloner

2

1
虽然已经有可行的解决方案,但它会将所有新字段放在页面底部。如果能够将字段追加到特定部分,并将字段从一个部分移动到另一个部分,那就更好了。
我使用这两个实用程序函数来将字段追加到字段集中并将字段从一个字段集移动到另一个字段集:

common/utils/admin.py

def append_fields(fieldsets, section, fields):
    """
    fieldsets : tuple
        The fieldsets to append to.
            - fieldsets for editing existing objects
            - add_fieldsets for adding new objects
    section : str or None
        The title of the section. None for the titleless section.
    fields : tuple
        The fields being appended.
    """
    for fieldset in fieldsets:
        if fieldset[0] == section:
            fieldset[1]['fields'] += fields
            break 
    else: # Add new section
        fieldsets = fieldsets + (
            (section, {
                'classes': ('wide',),
                'fields': fields
            }),
        )
    return fieldsets

def move_field(fieldsets, field, from_section, to_section):
    """
    fieldsets : tuple
        The fieldsets to append to.
            - fieldsets for editing existing objects
            - add_fieldsets for adding new objects
    field: str
        The name of the field to move.
    from_section : str or None
        The title of the section from which to remove the field.
    to_section : str or None
        The title of the section in which to add the field.
    """
    for fieldset in fieldsets:
        if fieldset[0] == from_section:
            field_list = list(fieldset[1]['fields'])
            field_list.remove(field) # will raise exception if field not found
            fieldset[1]['fields'] = tuple(field_list)
            break
    else:
        raise Exception(f'No such from fieldset: {from_section}')

    for fieldset in fieldsets:
        print(fieldset)
        if fieldset[0] == to_section:
            fieldset[1]['fields'] = fieldset[1]['fields'] + (field, )
            break
    else:
        raise Exception(f'No such to fieldset: {to_section}')

然后我将其导入到我的CustomUserAdmin类中:

users/admin.py

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin

from common.utils.admin import append_fields, move_field

CustomUser = get_user_model()

class CustomUserAdmin(UserAdmin):
    model = CustomUser

    # Fields for editing existing user
    new_fields = ('dob', 'avatar')
    fieldsets = append_fields(UserAdmin.fieldsets, 'Personal info', new_fields)
    move_field(UserAdmin.fieldsets, 'email', 'Personal info', None)

    # Fields for adding new user
    new_fields = ('email', )
    optional_fields = ('first_name', 'last_name', 'dob')
    add_fieldsets = append_fields(UserAdmin.add_fieldsets, None, new_fields)
    add_fieldsets = append_fields(
        UserAdmin.add_fieldsets, 'Optional Fields', optional_fields
    )


admin.site.register(CustomUser, CustomUserAdmin)

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