Django用ImportExportModelAdmin导入Excel正常,自定义视图报错及优化咨询
报错根因与修复
你出现格式报错的核心原因是:自定义导入视图没有调用你已经配置好的EmployeeResource逻辑,直接按行索引顺序给Employee模型传值,字段顺序不匹配导致单位名称被赋值给了日期字段,触发了格式校验。
你不需要自己循环读取行数据实例化模型,直接调用django-import-export提供的资源导入方法即可,和Admin后台的导入逻辑完全一致,自动处理外键匹配、格式转换。
完整修改方案
1. 修改resources.py 同时解决你的两个需求
from import_export import resources, fields from import_export.widgets import ForeignKeyWidget from .models import Employee, Unit class EmployeeResource(resources.ModelResource): # 删掉原有的id字段定义,即可取消id列必填要求 EmpID = fields.Field(attribute='EmpID', column_name='EmpID') Name = fields.Field(attribute='Name', column_name='Name') DOB = fields.Field(attribute='DOB', column_name='DOB') PresentUnit = fields.Field(attribute='PresentUnit', column_name='PresentUnit', widget=ForeignKeyWidget(Unit, 'UnitName')) PostInDate = fields.Field(attribute='PostInDate', column_name='PostInDate') class Meta: model = Employee # 指定用EmpID作为唯一判断标识,存在则更新、不存在则新增,解决第一个需求 import_id_fields = ('EmpID',) # 可选配置:数据无变化则跳过更新,减少数据库操作 skip_unchanged = True # 可选配置:明确排除不需要导入的id字段 exclude = ('id',)
2. 修改views.py 修复导入逻辑
@login_required(login_url='accounts:login') def upload_employee_view(request): if request.method == "POST": file = request.FILES['employeefile'] if not file.name.endswith('xlsx'): messages.info(request, "文件格式错误,请上传xlsx格式的文件") return render(request, 'employee/uploademployee.html') # 调用资源类完成导入,自动处理所有字段映射、外键匹配、更新逻辑 employee_resource = EmployeeResource() dataset = Dataset() imported_data = dataset.load(file.read(), format='xlsx') result = employee_resource.import_data(imported_data, dry_run=False) # 错误处理 if result.has_errors(): error_msgs = [] for row_num, errors in result.row_errors(): error_msgs.append(f"第{row_num}行错误:{','.join([str(e.error) for e in errors])}") messages.error(request, f"导入失败:{';'.join(error_msgs)}") else: messages.success(request, f"导入成功,新增{result.total_new}条,更新{result.total_updated}条") return render(request, 'employee/uploademployee.html')
内容的提问来源于stack exchange,提问作者KayP
相关产品推荐
相关产品推荐

