如何在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
相关产品推荐
相关产品推荐

