You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin面板中结合使用django-admin-sortable2与django-import-export

Django Admin同时集成django-admin-sortable2与django-import-export的解决方案

我需要在Django Admin面板中同时使用django-admin-sortable2和django-import-export两个包,以下是我的代码:

模型代码

class University(models.Model):
    name = models.CharField(max_length=50, help_text="University or Institution Name")
    short_name = models.CharField(blank=True, max_length=10, help_text="University or Institution Short Name")
    order = models.PositiveIntegerField(
        default=0,
        blank=False,
        null=False,
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'{self.id}-{self.name}' 

    class Meta:
        ordering = ['order'] 

Admin代码(初始版本)

from import_export import resources
from import_export.admin import ImportExportModelAdmin

from adminsortable2.admin import SortableAdminMixin
# Register your models here.

class UniversityResource(resources.ModelResource):
    class Meta:
        model = University
        exclude = ('created_at', 'updated_at',)


class UniveresityAdmin(ImportExportModelAdmin, SortableAdminMixin, admin.ModelAdmin):
    resource_classes = [UniversityResource]

admin.site.register(University, UniveresityAdmin)

遇到的问题

  • 使用class UniveresityAdmin(ImportExportModelAdmin, SortableAdminMixin, admin.ModelAdmin):时,控制台报错:
    failed to assign change_list_template attribute (see issue 1521)
    
  • 使用class UniveresityAdmin(ImportExportModelAdmin, SortableAdminMixin,):时,界面显示异常;
  • 使用class UniveresityAdmin(SortableAdminMixin, ImportExportModelAdmin,):时,报错:
    TypeError at /admin/core/university/
    join() argument must be str, bytes, or os.PathLike object, not 'list'
    

单独使用任意一个包都能正常工作,求同时使用两个包的解决办法。

解决方案

问题根源在于两个包都自定义了change_list_template模板路径,导致继承时出现冲突。可以通过以下步骤解决:

  1. 调整继承顺序:将SortableAdminMixin放在继承列表的最前面,再继承ImportExportModelAdmin(无需额外继承admin.ModelAdmin,因为ImportExportModelAdmin已经继承了它)。
  2. 指定兼容的模板:使用django-admin-sortable2提供的兼容模板,专门适配django-import-export的功能。

修改后的Admin代码如下:

from import_export import resources
from import_export.admin import ImportExportModelAdmin
from adminsortable2.admin import SortableAdminMixin
from django.contrib import admin

class UniversityResource(resources.ModelResource):
    class Meta:
        model = University
        exclude = ('created_at', 'updated_at',)

class UniversityAdmin(SortableAdminMixin, ImportExportModelAdmin):
    resource_classes = [UniversityResource]
    # 使用sortable2提供的兼容模板,同时支持导入导出和排序功能
    change_list_template = 'adminsortable2/change_list_import_export.html'

admin.site.register(University, UniversityAdmin)

如果上述模板不存在(可能是旧版本的django-admin-sortable2),可以手动合并模板路径:

class UniversityAdmin(SortableAdminMixin, ImportExportModelAdmin):
    resource_classes = [UniversityResource]
    
    def get_change_list_template(self, request, **kwargs):
        # 先获取ImportExportModelAdmin的模板,再添加sortable的模板
        template = super().get_change_list_template(request, **kwargs)
        return [template, 'adminsortable2/change_list.html']

这样就能同时启用排序功能和导入导出功能,且界面显示正常。


内容的提问来源于stack exchange,提问作者Sudipto Sarker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 21:02:02