Django (admin.e104) 必须继承自 'InlineModelAdmin'

问题描述 投票:0回答:5

尝试将某些模型作为内联模型放入其他两个模型中会出现一些奇怪的错误(标题中)。

我有两种订单模式 - 远程和本地。在每一个中,我都需要插入无限数量的产品。另一个目标是在不同列表中显示本地和远程订购的产品的完整列表。

第二个目标的解决方案:使用从第一个继承的产品的第二个模型及其自己的管理器(对象)。

第一目标的解决方案:在订单管理类中使用内联,以便按顺序附加完全正确的产品(本地产品到本地订单,远程产品到远程订单)。

将本地产品内联添加到本地购买管理中效果很好。 但是将远程产品的内联添加到远程订单管理文件的内联字段会返回远程订单管理类的错误:

must inherit from 'InlineModelAdmin'.

即使从本地订单的管理文件中删除内联后,它也会返回错误。

有些代码是这样的 在 models.py 中:

class RemotePurchaseModel(models.Model):
    title = models.CharField
    number = models.IntegerField
    ...

class LocalPurchaseModel(models.Model):
    title = models.CharField
    number = models.IntegerField
    ...

class LocalProductModel(models.Model):
    remote = models.BooleanField(default=False)
    actual_order = models.ForeignKey(to=LocalPurchaseModel, blank=True, null=True)
    remote_purchase = models.ForeignKey(to=RemotePurchaseModel, blank=True, null=True)
    ...

class RemoteProductManager(djando.db.models.Manager):
    def get_queryset(self):
        return super(PurchasedProductManager, self).get_queryset().filter(remote=True)

class RemoteProductModel(LocalProduct):
    proxy = True
    objects = RemoteProductManager
    ...

...

在admin.py中

from .models import LocalProductModel
from .models import RemoteProductModel
from .models import LocalPurchaseModel
from .models import RemotePurchaseModel
from django.contrib import admin

class LocalProductInline(admin.StackedInline):
    model = LocalProductModel
    extra = 1

class RemoteProductInline(admin.StackedInline):
    model = RemoteProductModel
    extra = 1

class LocalPurchaseAdmin(admin.ModelAdmin):
    list_display = ...
    fields = ...
    inlines = (LocalProductInline, )

class RemotePurchaseAdmin(admin.ModelAdmin):
    list_display = ...
    fields = ...
    inlines = (RemoteProductInline, )

...
admin.site.register(LocalPurchaseModel, LocalPurchaseAdmin)
admin.site.register(RemotePurchaseModel, RemotePurchaseAdmin)

这种变化的原因是在管理端本地和远程产品的两个显示不同的字段集。当然,所有字段都存在于 LocalProductModel 中。 有线索吗?

python django django-models django-admin
5个回答
47
投票

我的愚蠢错误是我将内联类名称放在引号内。

而不是:

class MyAdmin(admin.ModelAdmin):
    inlines = [MyInlineAdmin]

是:

class MyAdmin(admin.ModelAdmin):
    inlines = ['MyInlineAdmin']

总成本:

  • 2小时
  • 笔记本电脑屏幕上有一些划痕
  • 今天海里游泳的次数减少了

2
投票

我犯了同样错误的变体。

我的内联是:

class MyModelInline(admin.StackedInline):
    model = MyModel

但是我用模型名称来引用内联,而不是内联名称:

@admin.register(OtherModel)
class OtherModelAdmin(admin.ModelAdmin):
    inlines = [MyModel]

本来应该是:

@admin.register(OtherModel)
class OtherModelAdmin(admin.ModelAdmin):
    inlines = [MyModelInline]

该错误生成以下错误:

ERRORS:
<class 'app_name.admin.OtherModelAdmin'>: (admin.E104) 'app_name.models.models_file.MyModel' must inherit from 'InlineModelAdmin'.

1
投票

找到原因了。 在实际代码中(最初不是我的),模型的名称与它们所在的文件的名称相同。儿子在检查 Django(或 python)的某个步骤中检测到从 LocalProductModel 继承 RemoteProductModel 为错误 - 就像从文件继承一样,不是类模型。之后,它无法使用其字段,当然,如果远程产品,RemotePurchaseAdmin 无法像模型一样进行内联导入。 它不会警告继承错误,但会对 admin.ModelAdmin 发出 admin.E104 警告,试图导入不正确的模型或内联模型。

谢谢大家。希望这能警告其他开发人员不要犯愚蠢的错误。


0
投票

是的,问题是型号名称已更改,我解决了这个问题,运行

makemigrations
migrate


0
投票

一看就很明显...

注意到

inlines
列表之外意外的逗号了吗?这也会触发警告。

© www.soinside.com 2019 - 2024. All rights reserved.