django error:'ordering[0]'的值引用了'username',这不是'accounts.clinic_staff'的属性

pxy2qtax  于 2023-11-20  发布在  Go
关注(0)|答案(3)|浏览(114)

我使用一对一字段扩展了我的帐户自定义用户模型,它工作得很好。但是当我尝试自定义它以显示更多信息时,例如staff_number和location,返回以下错误:
<class 'accounts.admin.staffAdmin'>:(admin.E033)“ordering[0]”的值引用“username”,它不是“accounts.clinic_staff'"的属性。
staffAdmin类没有将用户名列为list_display,clinic_staff只是返回用户名。我被困在该怎么办?
这是我的帐户> models.py代码:

from datetime import date
import email
import imp
from pyexpat import model
from tkinter import CASCADE
from tkinter.tix import Tree
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager

class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, password=None,):
        if not email:
            raise ValueError('Email address is required')
        if not username:
            raise ValueError('Username is required')
        user = self.model(
            email=self.normalize_email(email),
            username = username,
        )
        user.set_password(password)
        user.save(using = self.db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password = password,
            username = username,
            )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using = self.db)
        return user

class Account(AbstractBaseUser):
    email   = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username = models.CharField(max_length=30, unique=True)
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    #is_clinic_staff = models.BooleanField(default=False)
    #staff_number = models.CharField(max_length=10, unique=True)
    is_superuser = models.BooleanField(default=False)  #note for self - these fields are required

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

    objects = MyAccountManager()

    def __str__(self):
        return self.email
    
    def has_perm(self, perm, obj=None):
        return self.is_admin # note to self - required
    
    def has_module_perms(self, app_Label):
        return True 

class clinic_staff(models.Model):
    staff = models.OneToOneField(Account, on_delete=models.CASCADE)

    location = models.CharField(max_length=255)
    staff_number = models.IntegerField()

    def __str__(self):
        return self.staff.username

字符串
我的帐户admin.py代码

from django.contrib import admin
from .models import clinic_staff
from accounts.models import Account
from accounts.models import clinic_staff
from django.contrib.auth.admin import UserAdmin

class AccountAdmin(UserAdmin):
    list_display = ('email', 'username', 'date_joined', 'last_login', 'is_admin', 'is_staff')
    search_field = ('email', 'username',)
    readonly_field = ('date_joined', 'last_login')
    filter_horizontal = ()
    list_filter = ()
    fieldsets = () # note to self: required field

class staffAdmin(UserAdmin):
    list_display = ('location', 'staff_number')
    search_field = ('location', 'staff_number')
    filter_horizontal = ()
    list_filter = ()
    fieldsets = ()

admin.site.register(Account, AccountAdmin)
admin.site.register(clinic_staff, staffAdmin)

b4lqfgs4

b4lqfgs41#

我遇到了同样的问题,并通过以下方式解决了它:
在admin.py中添加ordering属性,如:

class staffAdmin(UserAdmin):
    list_display = ('location', 'staff_number')
    search_field = ('location', 'staff_number')
    filter_horizontal = ()
    list_filter = ()
    fieldsets = ()
    **ordering = ('username',)**

字符串

pn9klfpd

pn9klfpd2#

更新:

My django ver:4.2
解决方案:根据django文档,解决方案很简单,只需添加一个ordering字段即可。

友情链接:https://docs.djangoproject.com/en/4.2/topics/auth/customizing/

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

@admin.register(CustomUser)
class CustomUserAdmin(BaseUserAdmin):
    list_display = ["email", "is_staff"]
    ordering = ["email"]

字符串

fcwjkofz

fcwjkofz3#

好的,我知道了。
如果不在生产环境中,请尝试删除数据库
并运行
manage.py makemigrations manage.py migrate

相关问题