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

如何在Django CSV导出中动态设置附件文件名(如当日日期)

解决Django视图中动态设置CSV下载文件名的问题

没问题,我帮你把静态文件名改成动态变量(比如结合查询日期范围或者当日日期),以下是修改后的完整代码,关键改动我会单独说明:

from datetime import datetime  # 建议把导入移到函数外,更规范
import csv
from django.http import HttpResponse
from django.db.models import Q
from .models import All_enquiries  # 确保导入你的模型

def district_wise_download(request):
    from_date = request.GET.get('from_date')
    to_date = request.GET.get('to_date')
    district = request.GET.get('district')
    print(district)
    
    if 'district' in request.GET:
        new_from = datetime.strptime(from_date, '%Y-%m-%d').date()
        new_to = datetime.strptime(to_date, '%Y-%m-%d').date()
        min_dt = datetime.combine(new_from, datetime.min.time())
        max_dt = datetime.combine(new_to, datetime.max.time())
        download_district = All_enquiries.objects.filter(
            Q(enquired_at__range=(min_dt, max_dt)) & Q(district=district)
        )
        
        # 方案1:用查询的日期范围+地区名作为文件名,更贴合下载内容
        filename = f"district_{district}_{from_date}_to_{to_date}.csv"
        # 方案2:用当日日期作为文件名,适合每日导出场景
        # filename = f"district_data_{datetime.today().strftime('%Y-%m-%d')}.csv"
        
        response = HttpResponse(content_type='text/csv')
        # 动态设置文件名,用f-string拼接变量
        response['Content-Disposition'] = f'attachment; filename="{filename}"'
        
        writer = csv.writer(response, delimiter=',')
        writer.writerow([
            'created_at','product_name','product_category','price',
            'customer_name','customer_mobile','state','district','city',
            'pincode','status','remarks','source','username'
        ])
        
        for obj in download_district:
            writer.writerow([
                obj.enquired_at, obj.product_name, obj.product_category, obj.price,
                obj.customer_name, obj.customer_mobile, obj.state, obj.district,
                obj.city, obj.pincode, obj.status, obj.remarks, 
                obj.get_source_display(), obj.user_id
            ])
        return response  # 把return移到if块内,避免无查询时返回空response
    
    # 处理没有district参数的情况,返回错误提示
    return HttpResponse("Missing 'district' parameter in request", status=400)

关键改动说明:

  • 动态生成文件名:用Python的f-string拼接变量生成文件名,提供了两种实用方案:
    • 方案1结合地区名和查询的起止日期,用户下载后能直接清楚文件对应的内容范围
    • 方案2用当日日期命名,适合固定每日导出的场景
  • 代码规范优化:把datetime和csv的导入移到函数外,同时修正了return的位置(原代码如果没有district参数会返回未初始化的response,现在增加了错误处理)
  • 简化代码:提前导入datetime后,datetime.datetime可以简化为datetime,让代码更简洁

内容的提问来源于stack exchange,提问作者Manjunath V M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:17:07