django 生成CSV文件并点击下载


最终效果:

跟据自己的条件搜索到相应的数据,然后点击下载,所生成csv文件即为看到的结果:

v01.png

v02.png

直接贴代码:

# urls.py 例如:

urlpatterns = [

    path('', views.index, name='index'),

]


# views.py

# 定义一个方法例如:

def csvv(request):

    # mymodels 为自己的所要遍历数据的models

    mymodels = mymodels_name.object.all()

    # content_type='text/csv' 定义格式

    response = HttpResponse(content_type='text/csv')

    # name.csv 下载时生成的文件名

     response['Content-Disposition'] = "attachment;filename=name.csv"

     context = {

           # 表格第一行显示的标题

          'title': ['姓名', '日期'],

           #  mymodels 为要遍历的自己models数据

          'rows': mymodels,

      }

      template = loader.get_template('abc.txt')

      csv_template = template.render(context)

      response.content = csv_template

      return response


在templates目录下新建一个abc.txt文件 内容所下:

# abc.txt

{{ title.0 }},{{ title.1 }}

{% for foo in rows %}{{ foo.name }},{{ foo.date }}

{% endfor %}


通过以上操作,访问Url映射页面后,就会直接下载name.csv文件

说明:通常我们会把models在html模板中遍历,如:

{%for foo in mymodels %}

    {{ foo.name }}

    {{ foo.date }}

{% endfor %}

而生成CSV的方法是通过.txt文件当做模板遍历

第1行:{{ title.0 }},{{ title.1 }}是取views中 context = {'title': ['姓名', '日期'], } 的第0个元素,第1个无素即为:姓名、日期

第2、3行:

{% for foo in rows %}{{ foo.name }},{{ foo.date }}

{% endfor %}

就是html模板中的用法是一样的,是当views中  context = {'rows': mymodels,} 中的mymodels传递到.txt文件中遍历,获取mymodels的属性,如:{{ foo.name }},{{ foo.date }} 等跟据自己的实际情况定义;


根据自己需求,搜索条件 点击下载csv

下面根据我新创建的实例说明:

# urls.py

from django.urls import path
from mycsv import views
urlpatterns = [
    path('', views.index, name='index')
]


# models.py

from django.db import models


class myCsv(models.Model):
    name = models.CharField(max_length=10)
    date = models.DateField()


# views.py

from django.http import HttpResponse
from django.shortcuts import render
from django.template import loader
from mycsv.models import myCsv


def index(request):
    # 获取前端models所需数据
    name = request.POST.get('name')
    date = request.POST.get('date')
    # 获取前端 搜索所需的数据
    search = request.GET.get('search', '')
    # 为赠加下载判断所需
    mycsv = request.GET.get('mycsv')
    # 获取访问路径,判断:因为当前页面不搜索时,路径为“/”而搜索后则是“/?search=数据/”再点击下载此时为mycsv 那么路径就是"/?search=搜索数据&mycsv=mycsv"
    csv_rul = request.get_full_path()
    # 不搜索时访问路径
    if csv_rul == '/':
        mycsv_url = csv_rul + '?mycsv=mycsv'
    else:
        # 搜索时访问路径
        mycsv_url = csv_rul + '&mycsv=mycsv'
    # 判断搜索数据内容
    if search == '':
        mycsv_all = myCsv.objects.all()
    else:
        mycsv_all = myCsv.objects.filter(name__contains=search)
    context = {
        'mycsv_all': mycsv_all,
        'mycsv_url': mycsv_url,
    }
    # 判断GET请求时。。。
    if request.method == "GET":
        # 判断点击下载时,所执行的CSV代码
        if mycsv:
            response = HttpResponse(content_type='text/csv')
            # name.csv 下载时生成的文件名
            response['Content-Disposition'] = "attachment;filename=name.csv"
            context = {
                # 表格第一行显示的标题
                'title': ['姓名', '日期'],
                # mycsv_all为要遍历的自己models数据
                'rows': mycsv_all,
            }
            template = loader.get_template('abc.txt')
            csv_template = template.render(context)
            response.content = csv_template
            return response
        return render(request, 'index.html', context)
    # 不是GET请求时添加数据
    else:
     context = {
       'mycsv_all': mycsv_all,
       'message': '添加成功'
     }
      myCsv.objects.update_or_create(name=name, date=date)
     return render(request, 'index.html', context)


# index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">{% csrf_token %}
<table>
    <tr>
        <td>姓名</td>
        <td><input type="text" name="name"></td>
    </tr>
    <tr>
        <td>日期</td>
        <td><input type="date" name="date"></td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit"></td>
    </tr>
</table>
</form>
{{message}}
<br><br>
<div class="panel panel-default">
  <!-- 添下加载按扭指定获取到的访问路径 -->
  <div class="panel-heading"><a href="{{ mycsv_url }}">点击下载看到的列表CSV</a></div>

  <!-- Table -->
<form action="">
    <input type="search" name="search" placeholder="请输入名字">
    <input type="submit" value="搜索">
    <br><br>
  <table class="table" border="1" cellpadding="10%" width="20%" cellspacing="0">
    <tr>
        <th>姓名</th>
        <th>日期</th>
    </tr>
    {% for foo in mycsv_all %}
        <tr>
            <td>{{ foo.name }}</td>
            <td>{{ foo.date }}</td>
        </tr>
    {% endfor %}

  </table>
</form>
</div>
</body>
</html>


运行结果展示如下图:

不提搜索时:

v03.png

搜索时:

v04.png