如何将Django表单的number_of_units值导出至Excel?
解决方案
根据你的需求,分两种场景给出针对性修复方案:
场景1:导出更新后的模型实例数据
问题根源是导出操作在表单保存前执行,导致读取的是模型旧值(默认0)。只需调整代码顺序,先保存表单再导出:
修改views.py中的form_valid方法:
def form_valid(self, form): # 先保存表单,完成实例的更新/创建 saved_instance = form.save() # 重新查询包含最新数据的数据集 filter_qs = CostCalculator.objects.filter(related_product__slug=self.kwargs['slug']) # 执行导出 dataset = CostCalculatorResource().export(filter_qs) # 修正Content-Type为标准Excel格式类型 response = HttpResponse(dataset.xlsx, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") response['Content-Disposition'] = 'attachment; filename=cost_calculator.xlsx' return response
场景2:所有导出行统一使用表单输入的number_of_units
如果需要忽略模型原有值,让导出的每一行都显示表单提交的数值,需自定义Resource的字段取值逻辑:
第一步:修改resources.py
from import_export import resources, fields from .models import CostCalculator class CostCalculatorResource(resources.ModelResource): related_product__title = fields.Field(attribute='related_product__title', column_name='Product') # 取消绑定模型attribute,自定义列名 number_of_units = fields.Field(column_name='Number of Units') class Meta: model = CostCalculator def dehydrate_number_of_units(self, obj): # 从上下文获取表单传入的数值, fallback到模型原有值(可选) return self.context.get('number_of_units', obj.number_of_units)
第二步:修改views.py中的form_valid方法
给Resource实例传入上下文,携带表单的输入值:
def form_valid(self, form): number_of_units = form.cleaned_data['number_of_units'] filter_qs = CostCalculator.objects.filter(related_product__slug=self.kwargs['slug']) # 创建Resource实例并注入上下文 resource = CostCalculatorResource() resource.context = {'number_of_units': number_of_units} dataset = resource.export(filter_qs) form.save() response = HttpResponse(dataset.xlsx, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") response['Content-Disposition'] = 'attachment; filename=cost_calculator.xlsx' return response
额外提示
原代码中的content_type="xlsx"不符合标准MIME类型规范,已修正为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,确保浏览器能正确识别文件类型。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

