利用 HttpResponse 创建一个响应对象,使用 csv.writer() 方法写入
models.py
class Order(models.Model):
""" 订单 """
oid = models.CharField(verbose_name='订单号', max_length=64)
title = models.CharField(verbose_name='名称', max_length=32)
price = models.IntegerField(verbose_name='价格')
status_choice = (
(1,'特支付'),
(2,'已支付'),
)
status = models.SmallIntegerField(verbose_name='支付状态', choices=status_choice, default=1)
# admin_id ForeignKey 会自动增加 _id
admin = models.ForeignKey(verbose_name='管理员', to='Admin', on_delete=models.CASCADE)
urls.py
path('order/export_to_csv/', order.download_csv),
views.py
import csv
from django.shortcuts import HttpResponse
def download_csv(request):
# 创建一个HTTP响应对象
response = HttpResponse(
# 类型csv, 不写就是html
content_type="text/csv",
# 指定headers, 附件和生成的文件名
headers={"Content-Disposition": 'attachment; filename="order-list.csv"'},
)
# 在 请求标头的 User-Agent 里检查 是否有Windows字符,如果有改变码为utf-8-sig,
# 否则 Windows系统 显示中文是乱码
if 'Windows' in request.headers.get('User-Agent'):
response.charset = 'utf-8-sig'
# 数据来源,可迭代的对象,需要导出的对象,可条件筛选
queryset = models.Order.objects.all().order_by('-oid')
# 构建一个csv 写入器,传入的参数为response
writer = csv.writer(response)
# writerow() 逐行写入,列表
# 写入第一行内容
writer.writerow(["订单号", "名称", "价格", "状态", '管理员'])
# 迭代器,对 queryset对象遍历循环,
# 每一行数据,csv写入器 写入一次
for obj in queryset:
# status是choice类型, 使用 get_status_display()
writer.writerow([obj.oid, obj.title, obj.price, obj.get_status_display(), obj.admin])
# 直接返回 响应对象
return response
创建连接导出
<a style="text-decoration: none" href="/order/export_to_csv/">csv导出</a>