【问题标题】:Custom User model fields (AbstractUser) not showing in django admin自定义用户模型字段(AbstractUser)未显示在 django admin 中
【发布时间】:2017-12-28 16:51:24
【问题描述】:

我使用 AbstractUser 方法为 django 扩展了用户模型。问题是,我的自定义字段没有显示在 django 管理面板中。

我的models.py:

from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    is_bot_flag = models.BooleanField(default=False)

我的 admin.py:

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

admin.site.register(User, UserAdmin)

谢谢

【问题讨论】:

  • 请指定django版本
  • 你完成迁移了吗? python manage.py makemigrationspython manage.py migrate
  • @aashu django 2.0,是的,我做了 python manage.py makemigrations 然后迁移

标签: python django


【解决方案1】:

如果您只想在标准编辑表单中添加新字段(而不是创建),那么有比上述解决方案更简单的解决方案。

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)

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

【讨论】:

    【解决方案2】:

    如果您想查看自定义字段,您还必须覆盖 UserAdmin。文档中有一个example here

    您必须创建用于创建(以及更改)用户数据的表单并覆盖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
    

    你覆盖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')}
            ),
        )
    

    然后你注册:

    admin.site.register(User, UserAdmin)
    

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

    【讨论】:

    • 谢谢,这帮助我找到了解决方案,我更容易 - 我必须将它添加到我的 admin.py:class UserAdmin(admin.ModelAdmin): model = User filter_horizo​​ntal = ('user_permissions' , '组',)
    【解决方案3】:

    试试这个...


    models.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)
    

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

    AUTH_USER_MODEL = 'users.CustomUser'
    

    forms.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__'
    

    admin.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)
    

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

    python manage.py makemigrations

    python manage.py 迁移

    python manage.py runserver

    【讨论】:

      【解决方案4】:

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

      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)
      

      注意
      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')})
      ]
      

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

      【讨论】:

        猜你喜欢
        • 2013-08-28
        • 2020-07-31
        • 1970-01-01
        • 2022-12-12
        • 2017-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        相关资源
        最近更新 更多