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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:36:29