0
点赞
收藏
分享

微信扫一扫

29Django生成csv文件

RJ_Hwang 2022-07-13 阅读 100

一知识点:

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>

 



举报

相关推荐

0 条评论