【问题标题】:What mistake am I making to cause these Django E304 errors?我犯了什么错误导致这些 Django E304 错误?
【发布时间】: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


【解决方案1】:

首先你不能在你的项目中使用AbstractUser模型两次,因为你已经指出你的settings.py文件是什么你的身份验证模型。

使用一个模型并在该模型中添加额外标志的最佳方法

is_adminis_appraiser 然后为您的管理员用户和评估用户定义两个单独的模型,并指向 OneToOneField

当你要处理登录/注册工作时,你根据标志来处理。

你去寻找类似的解决方案:

How to use multiple user models in Django?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 2023-03-03
    • 1970-01-01
    • 2023-01-26
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多