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)
Тем не менее, вы можете попробовать. И я очень надеюсь, что мой ответ хотя бы немного помог.