一知识点:
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
小练习:
视图:
#练习导表
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
路由:
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
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
模板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>