Django (admin.e104) должен наследовать от InlineModelAdmin - PullRequest
2 голосов
/ 10 июня 2019

Попытка поместить какую-либо модель как встроенную в двух других моделях приводит к некоторой странной ошибке (в заголовке).

У меня есть две модели заказов - удаленная и локальная.И в каждый из них мне нужно вставить продукты в каком-то неограниченном количестве.Другая цель - показать полный список продуктов, заказанных локально и удаленно в разных списках.

Решение для второй цели: использование второй модели продукта, унаследованной от первой, с собственным менеджером (объектами).

Решения для цели номер один: использовать строки в административных классах заказов для добавления точно соответствующего товара в заказ (локальный продукт к локальному заказу и удаленный продукт к удаленному заказу).

Добавление встроенного локального продукта администратору локального продуктапокупка отлично работает.Но добавление inline удаленного продукта в поле inlines административного файла удаленного заказа возвращает ошибку для класса admin удаленного заказа:

must inherit from 'InlineModelAdmin'.

Также возвращает ошибку даже после удаления inline из административного файла локального заказа.

Некоторый код, подобный этому, в 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.Есть какие-нибудь подсказки?Благодаря.

Ответы [ 2 ]

0 голосов
/ 21 июля 2019

Моя глупая ошибка заключалась в том, что у меня было встроенное имя класса внутри кавычек.

вместо:

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

это было:

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

Общая стоимость:

  • 2 часа
  • Некоторые царапины на экране ноутбука
  • Меньше плавания сегодня в море
0 голосов
/ 15 июня 2019

Нашел причину.В реальном коде, который изначально не является моим, имена моделей совпадают с именами файлов, в которые они помещены. Сын на некотором этапе проверки Django (или python) обнаруживает наследование RemoteProductModel от LocalProductModel как ошибку - как наследование от файла,не класс-модель.И после этого он не может работать со своими полями, и, конечно, RemotePurchaseAdmin не может выполнить импорт как встроенный, как модель, если удаленный продукт.Он не предупреждает об ошибке наследования, но вызывает admin.E104 для admin.ModelAdmin, который пытался импортировать неверную модель или встроенный файл.

Спасибо всем.Надеюсь, что это предупредит других разработчиков от глупых ошибок.

...