Django : 'empty_form' не используется в наборах полиморфных форм, вместо этого используйте 'empty_forms'

Я новичок в Python/ Django, мне было поручено перенести старый проект с Python 3.7 / Django 2.2.5 на Python 3.12 и Django 5.1, но когда я это сделал, некоторые функции перестали работать.

Например, раньше у меня в интерфейсе администратора, когда я нажимал на "Добавить наблюдателя", я мог создать наблюдателя и на той же странице выбрать настроенный триггер, индикатор и другие параметры.

Но в моей новой версии, когда я выбираю Добавить наблюдателя, у меня появляется эта ошибка:

RuntimeError at /admin/watchers/watcher/add/
'empty_form' is not used in polymorphic formsets, use 'empty_forms' instead.

Я использую последнюю версию django-polymorphic, nested-admin , Я знаю, что django-polymorphic указан как поддерживающий только версии Django 2.2, 3.0, 3.1, 3.2 и 4.0. Он не поддерживает Django версии 5.1, я попробовал более позднюю версию, используя pip install git+https://github.com/jazzband/django-polymorphic.git@v4.0.0a#egg=django-polymorphic, а также Django 4.x, и получил ту же ошибку:

from polymorphic.admin import PolymorphicParentModelAdmin, PolymorphicChildModelAdmin, PolymorphicInlineSupportMixin
import nested_admin
from django.db import transaction
from watchers.models import *
 
class TriggerInline(nested_admin.NestedStackedPolymorphicInline):
    model = apps.get_model('triggers', 'Trigger')
    child_inlines = tuple([type(f'{subclass.__name__}Inline', (nested_admin.NestedStackedPolymorphicInline.Child,),
                                {
                                    'model': subclass,
                                    'inlines': [
                                        TriggerComponentInline] if subclass.__name__ == "CompositeTrigger" else []
                                }) for subclass in apps.get_model('triggers', 'Trigger').__subclasses__()])

#Same that TriggerInline
class IndicatorInline(nested_admin.NestedStackedPolymorphicInline)    

class WatcherChildAdmin(PolymorphicChildModelAdmin):
    base_model = Watcher
    inlines = (IndicatorInline, TriggerInline,)
    #Other infos

#Register subclass
for subclass in Watcher.__subclasses__():
    admin_class = type(f'{subclass.__name__}Admin',
                       (nested_admin.NestedPolymorphicInlineSupportMixin,WatcherChildAdmin,),
                       {
                           'base_model': subclass,
                           'exclude': ['periodicTask', ],
                       })
    admin.site.register(subclass, admin_class)


@admin.register(Watcher)
class WatcherParentAdmin(PolymorphicInlineSupportMixin, PolymorphicParentModelAdmin):
    base_model = Watcher
    child_models = tuple(Watcher.__subclasses__())
    #Other Functions

И триггер, и индикатор имеют в модели наблюдателя, пример :

индикатор класса(полиморфная модель): ..... наблюдатель = models.OneToOneField(Наблюдатель, null=True, on_delete=models.КАСКАД)

Если вы поможете мне, вы будете лучше, чем Chatgpt, Deep Seek, Mistral (они не смогли найти решение)

Полная обратная трассировка =>

Спасибо

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

Библиотека django-polymorphic поддерживает только версию Django до 4.0 и Python до версии 3.9 в соответствии с официальной документацией и с этим ничего нельзя поделать. Есть два варианта: предложить оставить проект на старых версиях Django и Python или заменить фреймворк.

Во втором случае вы можете использовать встроенные Django Contenttypes (GenericForeignKey) или django-model-utils (для например, InheritanceManager и, кстати, django-model-utils поддерживает Django 3.2+, поэтому, если вы более внимательно посмотрите на функциональность этого фреймворка, возможно, это вам подойдет.).

К сожалению, я не могу предложить никаких других решений.

Возможно, ваш код мог бы выглядеть следующим образом (используя предоставленные инструменты (необходимо сравнить со всем, что есть в вашей модели и в другом коде! Не используйте без тестирования!)):

from django.contrib import admin
from model_utils.managers import InheritanceManager
#Other imports


class Watcher(models.Model):
    name = models.CharField(max_length=100)

    objects = InheritanceManager()


class Trigger(models.Model):
    watcher = models.ForeignKey(Watcher, null=True, on_delete=models.CASCADE)


class TriggerInline(nested_admin.NestedStackedInline):
    model = Trigger
    
    child_inlines = tuple([
        type(f'{subclass.__name__}Inline', (nested_admin.NestedStackedInline.Child,),
             {
                 'model': subclass,
                 'inlines': [TriggerComponentInline] if subclass.__name__ == "CompositeTrigger" else []
             }) for subclass in Trigger.__subclasses__()
    ])


class IndicatorInline(nested_admin.NestedStackedInline):
    model = apps.get_model('indicators', 'Indicator')


class WatcherChildAdmin(admin.TabularInline):
    model = Watcher
    inlines = (IndicatorInline, TriggerInline,)


@admin.register(Watcher)
class WatcherParentAdmin(admin.ModelAdmin):
    inlines = (IndicatorInline, TriggerInline)

Тем не менее, вы можете попробовать. И я очень надеюсь, что мой ответ хотя бы немного помог.

Вернуться на верх