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

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

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

  1. from datetime import date
  2. import email
  3. import imp
  4. from pyexpat import model
  5. from tkinter import CASCADE
  6. from tkinter.tix import Tree
  7. from django.db import models
  8. from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
  9. class MyAccountManager(BaseUserManager):
  10. def create_user(self, email, username, password=None,):
  11. if not email:
  12. raise ValueError('Email address is required')
  13. if not username:
  14. raise ValueError('Username is required')
  15. user = self.model(
  16. email=self.normalize_email(email),
  17. username = username,
  18. )
  19. user.set_password(password)
  20. user.save(using = self.db)
  21. return user
  22. def create_superuser(self, email, username, password):
  23. user = self.create_user(
  24. email=self.normalize_email(email),
  25. password = password,
  26. username = username,
  27. )
  28. user.is_admin = True
  29. user.is_staff = True
  30. user.is_superuser = True
  31. user.save(using = self.db)
  32. return user
  33. class Account(AbstractBaseUser):
  34. email = models.EmailField(verbose_name="email", max_length=60, unique=True)
  35. username = models.CharField(max_length=30, unique=True)
  36. date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
  37. last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
  38. is_admin = models.BooleanField(default=False)
  39. is_active = models.BooleanField(default=True)
  40. is_staff = models.BooleanField(default=False)
  41. #is_clinic_staff = models.BooleanField(default=False)
  42. #staff_number = models.CharField(max_length=10, unique=True)
  43. is_superuser = models.BooleanField(default=False) #note for self - these fields are required
  44. USERNAME_FIELD = 'email'
  45. REQUIRED_FIELDS = ['username',]
  46. objects = MyAccountManager()
  47. def __str__(self):
  48. return self.email
  49. def has_perm(self, perm, obj=None):
  50. return self.is_admin # note to self - required
  51. def has_module_perms(self, app_Label):
  52. return True
  53. class clinic_staff(models.Model):
  54. staff = models.OneToOneField(Account, on_delete=models.CASCADE)
  55. location = models.CharField(max_length=255)
  56. staff_number = models.IntegerField()
  57. def __str__(self):
  58. return self.staff.username

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

  1. from django.contrib import admin
  2. from .models import clinic_staff
  3. from accounts.models import Account
  4. from accounts.models import clinic_staff
  5. from django.contrib.auth.admin import UserAdmin
  6. class AccountAdmin(UserAdmin):
  7. list_display = ('email', 'username', 'date_joined', 'last_login', 'is_admin', 'is_staff')
  8. search_field = ('email', 'username',)
  9. readonly_field = ('date_joined', 'last_login')
  10. filter_horizontal = ()
  11. list_filter = ()
  12. fieldsets = () # note to self: required field
  13. class staffAdmin(UserAdmin):
  14. list_display = ('location', 'staff_number')
  15. search_field = ('location', 'staff_number')
  16. filter_horizontal = ()
  17. list_filter = ()
  18. fieldsets = ()
  19. admin.site.register(Account, AccountAdmin)
  20. admin.site.register(clinic_staff, staffAdmin)

b4lqfgs4

b4lqfgs41#

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

  1. class staffAdmin(UserAdmin):
  2. list_display = ('location', 'staff_number')
  3. search_field = ('location', 'staff_number')
  4. filter_horizontal = ()
  5. list_filter = ()
  6. fieldsets = ()
  7. **ordering = ('username',)**

字符串

pn9klfpd

pn9klfpd2#

更新:

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

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

  1. from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
  2. from .models import CustomUser
  3. @admin.register(CustomUser)
  4. class CustomUserAdmin(BaseUserAdmin):
  5. list_display = ["email", "is_staff"]
  6. ordering = ["email"]

字符串

fcwjkofz

fcwjkofz3#

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

相关问题