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>

 

posted @ 2021-12-08 16:29  linuxTang  阅读(69)  评论(0)    收藏  举报