【问题标题】:Django Custom User Model errors ((admin.E108) The value of 'list_display[2]' refers to 'first_name', which is not a callableDjango 自定义用户模型错误 ((admin.E108) 'list_display[2]' 的值指的是 'first_name',它不是可调用的
【发布时间】:2018-11-05 11:45:01
【问题描述】:

我有一个通过使用扩展 AbstractBaseUser 的自定义模型来扩展用户模型的代码。我收到此错误消息

(ERRORS: : (admin.E108) 的值 'list_display[2]' 指的是 'first_name',它不是可调用的, “UserAdmin”的属性,或“towns.MyUser”的属性或方法。 : (admin.E108) 的值 'list_display[3]' 指的是 'last_name',它不是可调用的, 'UserAdmin' 的属性,或 'towns.MyUser' 的属性或方法。

模型文件:

from django.contrib.auth.models import (
        BaseUserManager, AbstractBaseUser
    )


class MyUserManager(BaseUserManager):
    def create_user(self, username, email, password=None):
        if not email:
            raise ValueError('email address is required')

        user = self.model(
                username = username,
                email = self.normalize_email(email)
            )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, password=None):
        user = self.create_user(
                username, email, password=password
            )

        user.is_admin = True
        user.is_staff = True

        user.save(using=self._db)
        return user


class MyUser (AbstractBaseUser):
    username = models.CharField(
            max_length=255,
            unique=True
        )

    email = models.EmailField(
            max_length=255,
            unique=True,
            verbose_name='email address'

        )

    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)

    objects = MyUserManager()
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

表格文件:

from django.contrib.auth import get_user_model
from django.db.models import Q

User = get_user_model() 

from django import forms 

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 = ['username', 'email']

    def clean_password(self):
        password1 = self.cleaned_data.get('password1')
        password2 = self.cleaned_data.get('password2')
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("passwords do not match")
        return password2

    def save(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data['password1'])

        if commit:
            user.save()
        return user



class UserLoginForm(forms.Form):
    query = forms.CharField(label='Username or Email')
    password = forms.CharField(label='Password',widget=forms.PasswordInput)

    def clean(self, *args, **kwargs):
        query = self.cleaned_data.get('query')
        password = self.cleaned_data.get('password')

        user_qs_final = User.objects.filter(
                Q(username__iexact=query) |
                Q(email__iexact=query).distinct() 

            )
        if not user_qs_final.exists() and user_qs_final.count != 1:
            raise forms.ValidationError('Invalid credentials = user does not exist')

        user_obj = user_qs_final.first()
        if not user.obj.check_password(password):
            raise forms.ValidationError(' password is not correct')

        self.cleaned_data["user_obj"] = user_obj
        return super(UserLoginForm, self).clean(*args, **kwargs)

管理文件:

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

from .forms import UserCreationForm
from .models import MyUser


class UserAdmin(BaseUserAdmin):
    add_form =  UserCreationForm

    List_display = ('username', 'email', 'is_admin')
    list_filter = ('is_admin',)

    fieldsets = (
        (None, {'fields': ('username', 'email','password')}),

        ('Permissions', {'fields': ('is_admin',)}),
    )

    search_fields =  ('username', 'email')
    ordering = ('username','email')

    filter_horizontal = ()

admin.site.register(MyUser,UserAdmin)




admin.site.unregister(Group)

我也将设置文件中的 AUTH_USER_MODEL 更改为

AUTH_USER_MODEL = 'towns.MyUser'

任何线索如何解决这个错误

注意:我并不真正需要这些字段 (first_name), (last_name)

【问题讨论】:

    标签: django


    【解决方案1】:

    您的管理类中有一个错字,因为您没有覆盖包含first_name 的默认list_display 选项。它应该是list_display 而不是List_display 里面的UserAdmin

    class UserAdmin(BaseUserAdmin):
        add_form =  UserCreationForm
    
        list_display = ('username', 'email', 'is_admin')
        list_filter = ('is_admin',)
    
        fieldsets = (
            (None, {'fields': ('username', 'email','password')}),
    
            ('Permissions', {'fields': ('is_admin',)}),
        )
    
        search_fields =  ('username', 'email')
        ordering = ('username','email')
    
        filter_horizontal = ()
    
    admin.site.register(MyUser,UserAdmin)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2020-12-06
      • 2012-11-14
      • 2021-10-21
      相关资源
      最近更新 更多