Django import-export use both ExportActionModelAdmin and ExportMixin together

Viewed 26

In admin.py, using either:

from django.contrib import admin
from import_export.admin import ExportActionModelAdmin, ExportMixin

class BookAdmin(ExportActionModelAdmin, admin.ModelAdmin):
    # stuff

or

from django.contrib import admin
from import_export.admin import ExportActionModelAdmin, ExportMixin

class BookAdmin(ExportMixin, admin.ModelAdmin):
    # stuff

works well, but I'm not able to have both together:

from django.contrib import admin
from import_export.admin import ExportActionModelAdmin, ExportMixin

class BookAdmin(ExportActionModelAdmin, ExportMixin, admin.ModelAdmin):
    # stuff

In this latter case, the top right 'Export' button is missing (but the drop-down menu is OK).

How could I use both ExportActionModelAdmin and ExportMixin from import_export.admin in my admin classes in order to have both the drop-down menu for a fine grain selection, and the 'Export' button for exporting all the model in one click?

Doc URL: https://django-import-export.readthedocs.io/en/latest/getting_started.html#exporting-data

EDIT

The solution proposed by @Mark Bailey hereunder, e.g. defining the BookAdmin() as:

class BookAdmin(ExportMixin, ExportActionModelAdmin):
    # stuff

is raising this error:

 /app/app/admin.py changed, reloading.
 Watching for file changes with StatReloader
 Exception in thread django-main-thread:
 Traceback (most recent call last):
   File "/usr/local/lib/python3.9/threading.py", line 980, in _bootstrap_inner
     self.run()
   File "/usr/local/lib/python3.9/threading.py", line 917, in run
     self._target(*self._args, **self._kwargs)
   File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
     fn(*args, **kwargs)
   File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 125, in inner_run
     autoreload.raise_last_exception()
   File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 87, in raise_last_exception
     raise _exception[1]
   File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 398, in execute
     autoreload.check_errors(django.setup)()
   File "/usr/local/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
     fn(*args, **kwargs)
   File "/usr/local/lib/python3.9/site-packages/django/__init__.py", line 24, in setup
     apps.populate(settings.INSTALLED_APPS)
   File "/usr/local/lib/python3.9/site-packages/django/apps/registry.py", line 124, in populate
     app_config.ready()
   File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/apps.py", line 27, in ready
     self.module.autodiscover()
   File "/usr/local/lib/python3.9/site-packages/django/contrib/admin/__init__.py", line 50, in autodiscover
     autodiscover_modules("admin", register_to=site)
   File "/usr/local/lib/python3.9/site-packages/django/utils/module_loading.py", line 58, in autodiscover_modules
     import_module("%s.%s" % (app_config.name, module_to_search))
   File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
     return _bootstrap._gcd_import(name[level:], package, level)
   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
   File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
   File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
   File "<frozen importlib._bootstrap_external>", line 850, in exec_module
   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
   File "/app/app/admin.py", line 22, in <module>
     class BookAdmin(ExportMixin, ExportActionModelAdmin):
   File "/usr/local/lib/python3.9/site-packages/django/forms/widgets.py", line 224, in __new__
     new_class = super().__new__(mcs, name, bases, attrs)
 TypeError: Cannot create a consistent method resolution
 order (MRO) for bases ExportMixin, ExportActionModelAdmin
1 Answers

You need to be careful to understand what is a subclass, and what is a mixin.

ExportActionModelAdmin is a subclass of ModelAdmin, so you can use it just like this:

class BookAdmin(ExportActionModelAdmin):

ExportMixin is a mixin. It doesn't provide all the attributes of ModelAdmin, so it needs to be used in combination.

class BookAdmin(ExportMixin, admin.ModelAdmin):

To do what you ask, and assuming they are compatible, you would need:

class BookAdmin(ExportMixin, ExportActionModelAdmin):
Related