如何在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模板路径,导致继承时出现冲突。可以通过以下步骤解决:
- 调整继承顺序:将
SortableAdminMixin放在继承列表的最前面,再继承ImportExportModelAdmin(无需额外继承admin.ModelAdmin,因为ImportExportModelAdmin已经继承了它)。 - 指定兼容的模板:使用
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
相关产品推荐
相关产品推荐

