如何基于用户组在Django Import-Export Admin中动态切换资源类?
Django Import-Export 动态切换资源类解决方案
问题描述
使用Django Import-Export库管理后台导出功能时,需要根据当前用户的组归属动态切换资源类。尝试重写get_resource_class方法实现,但发现该方法无法获取到request对象,导致无法判断用户所属组。原实现代码如下:
from import_export.admin import ImportExportModelAdmin from django.contrib import admin from .resources import RawFileDMDResource, RawFileResource class RawFileAdmin(ImportExportModelAdmin): resource_class = RawFileResource [...] def get_resource_class(self, request=None): resource_class = self.resource_class if request is None: user = get_user() else: user = request.user if user.groups.filter(name='DMD ext_users').exists(): resource_class = RawFileDMDResource return resource_class
解决方案
方案一:重写get_export_resource_class方法(推荐)
ImportExportModelAdmin提供了专门用于导出场景的get_export_resource_class方法,该方法默认会接收request参数,直接重写此方法即可实现需求:
from import_export.admin import ImportExportModelAdmin from django.contrib import admin from .resources import RawFileDMDResource, RawFileResource class RawFileAdmin(ImportExportModelAdmin): resource_class = RawFileResource # 你的其他后台配置... def get_export_resource_class(self, request): # 通过request直接获取当前用户 if request.user.groups.filter(name='DMD ext_users').exists(): return RawFileDMDResource # 未匹配到组时返回默认资源类 return super().get_export_resource_class(request)
方案二:覆盖export_action传递request(适配旧版本库)
如果使用的Import-Export版本较旧,get_resource_class未被传入request,可以重写export_action方法,手动将request传递给get_resource_class:
from import_export.admin import ImportExportModelAdmin from django.contrib import admin from .resources import RawFileDMDResource, RawFileResource class RawFileAdmin(ImportExportModelAdmin): resource_class = RawFileResource # 你的其他后台配置... def get_resource_class(self, request=None): resource_class = self.resource_class if request and request.user.groups.filter(name='DMD ext_users').exists(): resource_class = RawFileDMDResource return resource_class def export_action(self, request, *args, **kwargs): # 调用get_resource_class时传入当前request self.resource_class = self.get_resource_class(request) return super().export_action(request, *args, **kwargs)
注意事项
- 优先使用方案一,符合库的设计规范;
- 确认用户组名称
'DMD ext_users'拼写正确,避免匹配失败; - 测试时切换不同组的用户登录后台,验证导出资源类是否正确切换。
内容的提问来源于stack exchange,提问作者Alex Anadon
相关产品推荐
相关产品推荐

