29Django生成csv文件
一知识点:
Django要求:如果你需要用open()去生成一个csv文件,那么你必须要给一个newline=''参数,
import csv #用open去生成一个csv文件 with open('eggs.csv','w',newline='') as csvfile: writer = csv.write(csvfile) #生成一个写对象 writer.writerow(['a','b','c']) #开始写
Django让浏览器实现下载的方法:
1响应Content-Type类型需要修改为text/csv,这告诉浏览器该文档是csv文件,而不是html文件
2响应会获得一个额外的Content-Disposition标头,其中包含csv文件名称。它将被浏览器用于开启”另存为...“对话框
import csv from django.http import HtpResponse from .models import Book def make)csv)view(request): #修改Content-Type类型 response = HttpResponse(content_type='text/csv') #添加响应头,告诉浏览器开启另存为 response['Content-Disposition'] = 'attachment; filename="mybook.csv"' #拿数据 all_book = Book.objects.all() #用上面的response生成写对象, writer = csv.writer(response) #开始写数据,写第一行,表头 writer.writerow(['id','title']) #开始写数据 for b in all_book: write.writerow([b.id, b.title]) return response
小练习:
视图:
#练习导表 def test_csv(request): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="test.csv"' all_data1 = ['a','b','c','d'] writer = csv.writer(response) writer.writerow(all_data1) return response
路由:
urlpatterns = [ path('test_csv',views.test_csv), ]
实战练习:
要求:在分页数据中添加一个csv下载按钮,下载的内容是本页数据:
1编写视图:
all_data = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n']
def make_page_csv(request): paginator = Paginator(all_data, 1) # 实例化分页类 page_num = request.GET.get('page', 1) # 获取当前页码 pagedata = paginator.page(page_num) # 获取当前页码的数据 #修改浏览器响应类型并添加响应头 response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="page-%s.csv"'%(page_num) #用上面的response生成写对象 writer = csv.writer(response) #开始写数据 for b in pagedata: print(b) writer.writerow([b]) return response
2配置路由:
urlpatterns = [ path('admin/', admin.site.urls), path('test_page',views.test_page), path('test_csv',views.test_csv), path('make_page_csv',views.make_page_csv), ]
3在Templates模板页面添加超链接
<a href="/make_page_csv?page={{ pagedata.number }}">生成csv</a>
4浏览器访问页面http://127.0.0.1:8000/test_page?page=8
生成csv
h
上一页 4 5 6 7 8 9 10 11 12 下一页
备注:
分页和导表视图函数如下:
import csv from django.core.paginator import Paginator from django.http import HttpResponse from django.shortcuts import render all_data = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n']
#分页 def test_page(request): paginator = Paginator(all_data,1) #实例化分页类 page_num = request.GET.get('page',1) #获取当前页码 pagedata = paginator.page(page_num) #获取当前页码的数据 pagecount = paginator.num_pages #获取总页数 pagerange = paginator.page_range #获取页码范围 #对页码进行判断 if int(page_num) <1: page_num = 1 if int(page_num) > pagecount: page_num = pagecount #返回页码循环数,在模板里遍历 if int(page_num) <= 5: page_list = pagerange[:10] elif int(page_num) + 5 > pagecount: page_list = pagerange[-10:] else: page_list = pagerange[int(page_num)-5:int(page_num)+4] return render(request,'test_page.html',locals()) #导表 def make_page_csv(request): paginator = Paginator(all_data, 1) # 实例化分页类 page_num = request.GET.get('page', 1) # 获取当前页码 pagedata = paginator.page(page_num) # 获取当前页码的数据 #修改浏览器响应类型并添加响应头 response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="page-%s.csv"'%(page_num) #用上面的response生成写对象 writer = csv.writer(response) #开始写数据 for b in pagedata: print(b) writer.writerow([b]) return response
模板html文件内容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>分页</title> </head> <body> <a href="/make_page_csv?page={{ pagedata.number }}">生成csv</a> {% for p in pagedata %} <p> {{ p }} </p> {% endfor %} {% if pagedata.has_previous %} <a href="/test_page?page={{ pagedata.previous_page_number }}">上一页</a> {% else %} 上一页 {% endif %} <!--当前页显示页码,非当前页显示a标签--> {% for p_num in page_list %} {% if p_num == c_page.number %} {{ p_num }} {% else %} <a href="/test_page?page={{ p_num }}">{{ p_num }}</a> {% endif %} {% endfor %} {% if pagedata.has_next %} <a href="/test_page?page={{ pagedata.next_page_number }}">下一页</a> {% else %} 下一页 {% endif %} </body> </html>

浙公网安备 33010602011771号