自定义用户模型字段(AbstractUser)未在django admin中显示

Sad*_*odo 9 python django

我使用AbstractUser方法扩展了django的User模型.问题是,我的自定义字段不会显示在django管理面板中.

我的models.py:

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    is_bot_flag = models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

我的admin.py:

from django.contrib.auth.admin import UserAdmin
from .models import User

admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 21

如果您只想将新字段添加到标准编辑表单(而不是创建),则有一个比上面介绍的更简单的解决方案。

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

from .models import User


class CustomUserAdmin(UserAdmin):
    fieldsets = (
        *UserAdmin.fieldsets,  # original form fieldsets, expanded
        (                      # new fieldset added on to the bottom
            'Custom Field Heading',  # group heading of your choice; set to None for a blank space instead of a header
            {
                'fields': (
                    'is_bot_flag',
                ),
            },
        ),
    )


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

这将获取基本字段集,展开它们,并将新的字段集添加到表单底部。您也可以使用新CustomUserAdmin类来修改模型管理,像其他属性list_displaylist_filterfilter_horizontal。相同的 expand-append 方法适用。


Bor*_*rut 9

UserAdmin如果要查看自定义字段,还必须重写。文档中有一个示例

您必须创建用于创建(并更改)用户数据和覆盖的表单UserAdmin。用于创建用户的表格为:

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = '__all__'

    def clean_password2(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user
Run Code Online (Sandbox Code Playgroud)

您可以UserAdmin使用:

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin

class UserAdmin(BaseUserAdmin):
    add_form = UserCreationForm
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'first_name', 'last_name', 'is_bot_flag', 'password1', 'password2')}
        ),
    )
Run Code Online (Sandbox Code Playgroud)

然后您注册:

admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

我几乎从文档中复制/粘贴了此内容,并删除了一些代码以使其更短。转到文档以查看完整的示例,包括用于更改用户数据的示例代码。

  • 谢谢,这帮助我找到了解决方案,我的工作更加轻松-我必须将其添加到我的admin.py中:类UserAdmin(admin.ModelAdmin):model = User filter_horizo​​ntal =('user_permissions','groups',) (2认同)

小智 6

在 Django 管理面板中为 AbstractUser 模型显示额外字段的最快方法是将 UserAdmin.fieldsets 元组解压缩到 admin.py 中的列表,然后编辑以在相关部分插入您的字段并重新打包为元组(见下文)。
将此代码添加admin.py到您的 Django 应用程序中

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

fields = list(UserAdmin.fieldsets)
fields[0] = (None, {'fields': ('username', 'password', 'is_bot_flag')})
UserAdmin.fieldsets = tuple(fields)

admin.site.register(User, UserAdmin)
Run Code Online (Sandbox Code Playgroud)

注意
list(UserAdmin.fieldsets) 给出了以下列表:

[  (None, {'fields': ('username', 'password')}), 
   ('Personal info', {'fields': ('first_name', 'last_name', 'email')}), 
   ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 
'user_permissions')}), 
   ('Important dates', {'fields': ('last_login', 'date_joined')})
]
Run Code Online (Sandbox Code Playgroud)

这些字段默认在 Django 用户模型中,这里我们修改列表的第一个索引以添加我们的自定义字段。


小智 5

尝试这个...


模型.py

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


# Create your models here.
class CustomUser(AbstractUser):
    phone_number = models.CharField(max_length=12)
Run Code Online (Sandbox Code Playgroud)

settings.py:在settings.py中添加以下代码行

AUTH_USER_MODEL = 'users.CustomUser'
Run Code Online (Sandbox Code Playgroud)

表格.py

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


class CustomUserCreationForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = '__all__'
Run Code Online (Sandbox Code Playgroud)

管理员.py

from django.contrib import admin
from .models import CustomUser
from .forms import CustomUserCreationForm
from django.contrib.auth.admin import UserAdmin


# Register your models here.
class CustomUserAdmin(UserAdmin):
    model = CustomUser
    add_form = CustomUserCreationForm
    fieldsets = (
        *UserAdmin.fieldsets,
        (
            'Other Personal info',
            {
                'fields': (
                    'phone_number',
                )
            }
        )
    )


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

全部完成后,然后在终端中运行以下命令

python 管理.py makemigrations

python 管理.py 迁移

python 管理.py runserver