Django : 'empty_form' is not used in polymorphic formsets, use 'empty_forms' instead

I am newbie at Python/Django i have been charged to migrate old project from Python 3.7 / Django 2.2.5 to the Python 3.12 and Django 5.1 but when i did this some functionality didn't work now .

For exemple before i have in the Admin interface when i click on "Add watcher" i can create watcher and in the same page choose the realted Trigger, Indicator and other staff.

But in my new version when i choose Add Watcher i have this error :

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

I am using the last version of django-polymorphic, nested-admin

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

Both Trigger and Indicator have watcher in the model, example :

class Indicator(PolymorphicModel): ..... watcher = models.OneToOneField(Watcher, null=True, on_delete=models.CASCADE)

If you help me you are better than Chatgpt :)

Full traceback =>

`Environment:


Request Method: GET
Request URL: http://localhost:7000/admin/watchers/watcher/add/?ct_id=24

Django Version: 5.1
Python Version: 3.12.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'indicators',
 'triggers',
 'watchers',
 'underlyings',
 'users',
 'frontend',
 'rest_framework',
 'polymorphic',
 'django_celery_beat',
 'webpush',
 'corsheaders',
 'taggit',
 'taggit_serializer',
 'phone_field',
 'ckeditor',
 'ckeditor_uploader',
 'nested_admin']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.gzip.GZipMiddleware',
 'corsheaders.middleware.CorsMiddleware']



Traceback (most recent call last):
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\options.py", line 718, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\utils\decorators.py", line 188, in _view_wrapper
    result = _process_exception(request, e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\utils\decorators.py", line 186, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\views\decorators\cache.py", line 80, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\sites.py", line 241, in inner
    return view(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\polymorphic\admin\parentadmin.py", line 211, in add_view
    return real_admin.add_view(request, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\options.py", line 1961, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\utils\decorators.py", line 48, in _wrapper
    return bound_method(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\utils\decorators.py", line 188, in _view_wrapper
    result = _process_exception(request, e)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\utils\decorators.py", line 186, in _view_wrapper
    response = view_func(request, *args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\options.py", line 1820, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\options.py", line 1919, in _changeform_view
    media += inline_formset.media
             ^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\helpers.py", line 466, in media
    for fs in self:
              ^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\django\contrib\admin\helpers.py", line 376, in __iter__
    self.formset.empty_form,
    ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\inetpub\wwwroot\orion\venv\Lib\site-packages\polymorphic\formsets\models.py", line 292, in empty_form
    raise RuntimeError(
    ^

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

Thanks

django-polymorphic is listed as only supporting Django versions 2.2, 3.0, 3.1, 3.2 and 4.0. It does not support Django version 5.1.

Back to Top