Django Custom User --- 在 admin 中编辑新的 CustomUser 字段

Django Custom User --- Edit new CustomUser fields in admin

我正在尝试扩展下面发布的 William Vincent 教程:

https://wsvincent.com/django-custom-user-model-tutorial/

我正在尝试向通过从 django.contrib.auth.models:

导入的 AbstractUser 扩展的 CustomerUser 模型添加新字段

users/models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser, UserManager

class CustomUserManager(UserManager):
    pass

class CustomUser(AbstractUser):
    bio         = models.TextField(max_length=500, blank=True)

    objects = CustomUserManager()

    def __str__(self):
        return self.username

我在上面的模型中添加了 'bio' 字段,但是当我通过 django 管理门户访问用户时,我没有在默认管理中看到新的 'bio' 字段用 django 打包的字段:即:个人信息:名字、姓氏、电子邮件地址等

我的 CustomUser 应用程序已注册到管理门户(按照上述教程):

作为对自己的测试,我能够在 list_display 中成功显示个人简介字段(如预期显示为空白)。重申一下,我的问题是当我点击编辑用户时我无法更新这个字段。好消息是 django 获取了我的新 'bio' 字段的迁移。

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

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ['username', 'email','is_staff', 'bio']

admin.site.register(CustomUser, CustomUserAdmin)

我猜我正在寻找的解决方案与编辑管理表单有关。这是我的用户应用程序中的内容(来自教程)。

users/forms.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('username', 'email')

class CustomUserChangeForm(UserChangeForm):

    class Meta:
        model = CustomUser
        fields = ('username', 'email')

诚然,我对上面 form.py 文件中发生的事情并没有很好的理解。我怀疑它可能与我通过管理门户访问的实际用户编辑表单无关,所以我可能只需要弄清楚如何更改默认的 django 管理应用程序。

一如既往,非常感谢您的帮助,谢谢!

安迪尝试将此添加到您的管理员 class:

fieldsets = (
        (('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
    )

您还可以添加其他集,例如另一个关于权限的部分,可以显示有关 is_active 或组的信息。你可以这样做:

fieldsets = (
        (('User'), {'fields': ('username', 'email','is_staff', 'bio')}),
        (('Permissions'), {'fields': ('is_active','is_staff')}),
    )

您可以在 list_display 下插入字段集。对于您不想在管理员中编辑的字段,还有一个 readonly_fields。

'fieldsets +' 方法比必须再次写出所有默认字段要好得多。

fieldsets = UserAdmin.fieldsets + (
    (None, {'fields': ('some_extra_data',)}),
)

要将“个人简介”字段添加到“个人信息”部分而不是仅添加到用户管理的末尾,并且要在不指定每个现有字段的情况下这样做,您可以构建一个新的 fieldsets parent class 中的属性,同时仅将新的“个人简介”字段添加到“个人信息”部分并保留其他所有内容。

如果您只是简单地附加到 parent 的 fieldsets 属性,则该字段将出现在页面底部,而不是“个人信息”部分的末尾。

此代码复制了 parent 的 fieldsets 属性,并保留了所有内容 as-is 除了“个人信息”部分中的 fields 元组具有附加了“生物”。

users/admin.py 中:

class CustomUserAdmin(UserAdmin):
    # Add a "bio" field to the User admin page.
    fieldsets = tuple(
        # For the "Personal info" fieldset, drill down to the fields,
        # preserving everything else.
        (fieldset[0], {
            # Preserve any entries in the dict other than "fields".
            **{key: value for (key, value) in fieldset[1].items() if key != 'fields'},
            # Add the "bio" field to the existing fields
            'fields': fieldset[1]['fields'] + ('bio',)
        })
        # Preserve any fieldsets other than "Personal info".
        if fieldset[0] == 'Personal info'
        else fieldset
        for fieldset in UserAdmin.fieldsets
    )

注意: {**some_dict, new_key: new_value} 语法要求 Python 3.5 或更高版本。