【发布时间】:2021-10-17 17:02:09
【问题描述】:
我一生都无法弄清楚我在这里做错了什么,非常感谢任何帮助!
目标: 我们有管理员和评估师在网站上注册。管理员当然可以从 /admin 站点执行您期望的所有操作,并且评估人员拥有自己的站点 /portal。我现在要做的是改进我当前的模型,以便我可以向评估员用户添加更多字段。管理员用户的字段是评估员用户字段的子集。
错误:
SystemCheckError: System check identified some issues:
ERRORS:
accounts.Appraiser.groups: (fields.E304) Reverse accessor for 'accounts.Appraiser.groups' clashes with reverse accessor for 'accounts.Admin.groups'.
HINT: Add or change a related_name argument to the definition for 'accounts.Appraiser.groups' or 'accounts.Admin.groups'.
accounts.Appraiser.user_permissions: (fields.E304) Reverse accessor for 'accounts.Appraiser.user_permissions' clashes with reverse accessor for 'accounts.Admin.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'accounts.Appraiser.user_permissions' or 'accounts.Admin.user_permissions'.
accounts.Admin.groups: (fields.E304) Reverse accessor for 'accounts.Admin.groups' clashes with reverse accessor for 'accounts.Appraiser.groups'.
HINT: Add or change a related_name argument to the definition for 'accounts.Admin.groups' or 'accounts.Appraiser.groups'.
accounts.Admin.user_permissions: (fields.E304) Reverse accessor for 'accounts.Admin.user_permissions' clashes with reverse accessor for 'accounts.Appraiser.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'accounts.Admin.user_permissions' or 'accounts.Appraiser.user_permissions'.
在有人问之前我的AUTH_USER_MODEL 设置:) AUTH_USER_MODEL = "accounts.Admin"
管理员/评估员用户及其经理:
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import UserManager
class AppraiserManager(UserManager):
@property
def licensed_appraisers(self):
...
...
class Appraiser(AbstractUser):
license_num = models.CharField(
max_length=25, verbose_name="Appraiser License #", blank=False, null=False
)
license_expiration = models.DateField(
verbose_name="Appraiser License Expiration Date", blank=False, null=False,
)
email = models.EmailField(
max_length=254,
blank=False,
null=False,
)
objects = AppraiserManager()
@staticmethod
def get_or_create(
first_name: str,
last_name: str,
license_num: str,
license_exp: date,
email: str,
username: str = None,
):
first_name = first_name.strip()
last_name = last_name.strip()
license_num = license_num.strip()
email = email.strip().lower()
group = group_helpers.get_or_create_appraisers_group()
user, created = Appraiser.objects.get_or_create(
first_name=first_name,
last_name=last_name,
license_num=license_num,
license_exp=license_exp,
email=email,
username=username or f"{first_name.lower()}.{last_name.lower()}",
is_active=True,
is_superuser=False,
is_staff=True,
)
user.save()
group.user_set.add(user)
class AdminManager(UserManager):
pass
class Admin(AbstractUser):
email = models.EmailField(
max_length=254,
blank=False,
null=False,
)
additional_info = models.OneToOneField(
Appraiser, unique=True, on_delete=models.DO_NOTHING, related_name="admin"
)
objects = AdminManager()
他们的相关表格(就我的目的而言,它们并不完整,但我认为没有任何遗漏会导致这种情况?):
from django.contrib.auth.forms import UserChangeForm
from django.contrib.auth.forms import UserCreationForm
from .models import Appraiser
from .models import Admin
class AppraiserCreationForm(UserCreationForm):
class Meta:
model = Appraiser
fields = ("username", "email")
class AppraiserChangeForm(UserChangeForm):
class Meta:
model = Appraiser
fields = ("username", "email")
class AdminCreationForm(UserCreationForm):
class Meta:
model = Admin
fields = ("username", "email")
class AdminChangeForm(UserChangeForm):
class Meta:
model = Admin
fields = ("username", "email")
accounts 应用的 admin.py 文件:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import AppraiserChangeForm
from .forms import AppraiserCreationForm
from .forms import AdminChangeForm
from .forms import AdminCreationForm
from .models import Appraiser
from .models import Admin
class AppraiserAdmin(UserAdmin):
add_form = AppraiserCreationForm
form = AppraiserChangeForm
model = Appraiser
list_display = [
"username",
]
class AdminAdmin(UserAdmin):
add_form = AdminCreationForm
form = AdminChangeForm
model = Admin
list_display = [
"username",
]
admin.site.register(Admin, AdminAdmin)
我可以根据需要/要求提供更多代码/信息!
【问题讨论】:
-
你在settings.py中设置了auth_user_model吗?
-
AbstractUser 使用外键定义模型字段,并像这样用两个模型继承它们会导致这些外键的相关名称发生冲突。
标签: python django django-models django-forms django-users