【问题标题】:Value of 'list_display[2]' refers to 'first_name', which is not a callable, an attribute of 'UserAdmin', or an attribute on 'authentication.User''list_display[2]' 的值是指 'first_name',它不是可调用的、'UserAdmin' 的属性或 'authentication.User' 上的属性
【发布时间】:2021-04-03 10:08:54
【问题描述】:

我正在尝试将以下代码添加到 admin.py 以确保从 django admin 创建的用户密码将被散列。

from django.contrib import admin
from .models import *

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


class UserAdmin(DjangoUserAdmin):
    pass


# Register your models here.
admin.site.register(User, UserAdmin)

但是当我尝试时,我得到了以下结果:

: (admin.E108) 的值 'list_display[2]' 指的是 'first_name',它不是可调用的, 'UserAdmin' 的属性,或属性或方法 'authentication.User'。

用户模型如下所示

class User(AbstractBaseUser, PermissionsMixin):

id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
username = models.CharField(max_length=255, unique=True, db_index=True)
email = models.EmailField(max_length=255, unique=True, db_index=True)

is_verified = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)

created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

balance = models.FloatField(default=0.0)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']

objects = UserManager()

def __str__(self):
    return self.email

def tokens(self):
    """" Метод получения токена """
    refresh = RefreshToken.for_user(self)
    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token)
    }

def has_delete_permission(self, *args, **kwargs):
   
    return True if self.is_staff is True else False

【问题讨论】:

  • 您的User 模型没有first_namelast_name...
  • 您可能还需要将formadd_form 属性更改为您自己的表单(它们直接使用默认用户模型)。
  • @WillemVanOnsem 如果我不想在我的模型中有这个字段怎么办?
  • @AlexNikitin:您需要更改提及这些字段的所有属性,例如list_display = ('username', 'email', 'is_staff')
  • @AlexNikitin:但问题更严重,因为正如 Abdul 所说,您还需要更新表单,以便这些表单也不再使用这些字段。

标签: python django


【解决方案1】:

您使用了UserAdmin,但在UserAdmin [GitHub] 中,这适用于first_namelast_name在您的自定义@987654327 上定义的字段@模型。

@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    # …
    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')}),
    )
    # …
    list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
    list_filter = ('is_staff', 'is_superuser', 'is_active', 'groups')
    search_fields = ('username', 'first_name', 'last_name', 'email')
    ordering = ('username',)
    filter_horizontal = ('groups', 'user_permissions',)
    # …

因此,您将不得不重写fieldsetslist_displaysearch_fields,这样它们就不再提及first_namelast_name 字段。当然,您也可以更改您的 User 模型以包含这些字段,但现在 UserAdmin 和您的 User 模型之间存在不匹配。

此外,@AbdulAzizBarkat says,这个模型管理员还有一个 formadd_form,它们也将包括这些字段。

【讨论】:

    【解决方案2】:

    我想出了下面的 admin.py 代码

    from django.contrib import admin
    from .models import *
    
    from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
    from django.forms import ModelForm
    
    
    class UserCreationForm(ModelForm):
        class Meta:
            model = User
            fields = ('email',)
    
        def save(self, commit=True):
            # Save the provided password in hashed format
            user = super(UserCreationForm, self).save(commit=False)
            user.set_password(self.cleaned_data["password"])
            if commit:
                user.save()
            return user
    
    
    class UserAdmin(DjangoUserAdmin):
        # The forms to add and change user instances
        add_form = UserCreationForm
        list_display = ("email",)
        ordering = ("email",)
    
        fieldsets = (
            (
                None, {
                    'fields': (
                        'email',
                        'password',
                        'first_name',
                        'last_name',
                        'balance',
                        'is_verified',
                        'is_active',
                        'is_staff'
                    )
                }
            ),
        )
        add_fieldsets = (
            (
                None, {
                    'classes': ('wide',),
                    'fields': (
                        'email',
                        'password',
                        'first_name',
                        'last_name',
                        'is_superuser',
                        'is_staff',
                        'is_active',
                        'is_verified'
                    )
                }
            ),
        )
    
        filter_horizontal = ()
    
    
    # Register your models here.
    admin.site.register(User, UserAdmin)
    

    【讨论】:

      【解决方案3】:

      虽然问题很老,但我正在回答这个问题,以便对其他人有所帮助。在扩展 AbstractBaseUser 的用户模型中,应添加一个方法,其中包含字段名称,以便在扩展 admin.ModelAdminadmin 的类中显示为:

      @admin.display(ordering='user__first_name')
          def first_name(self):
          return self.user.first_name
      

      【讨论】:

      • 我不太清楚这将如何解决问题:用户模型没有user 字段,因此self.user 将引发属性错误,出于同样的原因,使用@987654324 @ 也不起作用。
      猜你喜欢
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多