Django自定义用户---在管理员中编辑新的CustomUser字段

12

我正在尝试扩展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管理门户访问用户时,我没有看到与Django默认提供的管理员字段打包在一起的新的“bio”字段。 例如:个人信息:名字,姓氏,电子邮件地址等。
我的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管理应用程序进行更改。

像往常一样,非常感谢您的帮助!

3个回答

13

Andy,尝试将这个添加到你的管理员类中:

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选项,用于指定在管理界面中不可编辑的字段。


1
非常感谢!这正是我在寻找的。 - Andy
1
@Whodini @AndyG 谢谢,但是添加此 fieldsets 对象显然会覆盖默认字段,这些字段由例如 个人信息权限重要日期 等结构组成... 怎样才能简单地添加一个要在此页面上更改的字段,而不删除现有的结构和字段呢? - sc28
1
@sc28 - 你仍然可以使用字段集(fieldsets)来保留个人信息、权限和重要日期等结构。使用上面的示例,你只需在第一行中将('User')替换为'个人信息',然后跟随该部分所需的'fields',以此类推处理每个部分。我更喜欢覆盖它,因为这样可以更容易地添加或删除字段,并且我喜欢其可定制性。还有一个字段设置,但我记不清它如何在UserAdmin(默认情况下为fieldsets)中工作,因为我现在已经使用fieldsets很长时间了。 - user9727749
7
保持UserAdmin结构:`fieldsets = UserAdmin.fieldsets + ( (None, {'fields': ('bio',)}), )` - Quitiweb
1
is_stuff 不应该在用户字段中,它只需要在权限中,最好使用 @Quitiweb 的方法。 - smrf

13

使用“fieldsets+”方法比重新编写所有默认字段要好得多。

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

2
为了将“个人信息”部分的“简介”字段添加到用户管理界面的末尾,而不是只在最后指定现有字段,您可以从父类构造一个新的fieldsets属性,仅将新的“简介”字段添加到“个人信息”部分,并保留其他所有内容。
如果您仅附加到父级的fieldsets属性,则该字段将显示在页面底部,而不是“个人信息”部分的末尾。
此代码复制了父级的fieldsets属性,除了在“个人信息”部分中的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或更高版本。


其他人的答案把该字段放在页面底部,但这个答案是唯一一个将该字段包含在“个人信息”部分中的答案。 - luckyguy73

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