第四讲 生成csv格式文件并下载

99 篇文章 0 订阅
13 篇文章 0 订阅

address = [
    ('张三', '地址一'),
    ('李四', '地址二')
    ]
#这里 address 不再是字典的列表,而是 tuple 的列表。

def output(request, filename):

    #response = HttpResponse(mimetype='text/csv')
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename=%s.csv' % filename
    #这两行是用来处理输出类型和附件的。它表明返回的是一个 csv 格式的文件

    t = loader.get_template('csv.html')
    c = Context({'data': address,})
    response.write(t.render(c))

{% for row in data %}"{{ row.0|addslashes}}", "{{ row.1|addslashes}}",
{% endfor %}

for row in data
    "{{ row.0|addslashes}}", "{{ row.1|addslashes}}",
endfor

{% for row in data %}{{ row.0}},{{ row.1}}
{% endfor %}



第四讲生成csv格式文件并下载


1   引言


经过前几节的学习,我想大家应该比较熟悉 Django 的大致开发流程了:


  • 增加 view 方法

  • 增加模板

  • 修改 urls.py

    剩下的就是挖掘 Django 提供的其它的能力。在我们还没有进入模型(model)之前还是再看一看外围的东西,再更进一步体验 Django 吧。在 Django 中我看到了一个生成csv 格式的文档(OutputtingCSV dynamically),非常好,它没有数据库,正好用来做演示。现在我的需求就是提供 csv 格式文件的下载。我们会在原来 list(表格) 例子基础上进行演示,步骤就是上面的流程。

    2   修改 templates/list.html

    在文件最后增加:

    <p><ahref="/csv/address/">csv格式下载</a></p>

    它将显示为一个链接,它所指向的链接将用来生成 csv 文件。

    3   newtest下增加 csv_test.py

    #coding=utf-8

    fromdjango.http import HttpResponse

    fromdjango.template import loader, Context

    address = [

        ('张三', '地址一'),

        ('李四', '地址二')

        ]

    defoutput(request, filename):

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

        response['Content-Disposition'] ='attachment; filename=%s.csv' % filename

        t = loader.get_template('csv.html')

        c = Context({'data': address,})

        response.write(t.render(c))

        return response

    loader, Context 是从 django.core.template 导入的,而 0.95 django.template 。具体可以参考: NamespaceSimplification文档。以后类似的地方不再详述。

    这里使用的东西多了一些。这里没有 render_to_response 了,而是演示了一个完整的从头进行模板解析的处理过程。为什么需要这样,因为我们需要修改 response 对象的值,而 render_to_response 封装了它使得我们无法修改。从这里我们也可以看到,在调用一个方法时, Django 会传入一个 request 对象,在返回时,你需要将内容写入 response ,必要时修改它的某些属性。更详细的建议你参考 django 所带的 request_response 文档,里面详细描述了两个对象的内容,并且还可以在交互环境下进行测试,学习非常方便。response 对象也是由 Django 自动维护的。具体的内容参见 Requestand response objects 文档。

    这里 address 不再是字典的列表,而是 tuple 的列表。让人高兴的是, Django 的模板除了可以处理字典,还可以处理序列,而且可以处理序列中的元素。一会在模板定义中我们会看到。

    这里output() 是我们希望 Django 调用的方法,不再是 index() 了。而且它与前面的 index() 不同,它带了一个参数。这里主要是想演示 url 的参数解析。因此你要注意,这个参数一定是放在 url 上的。它表示输出文件名。

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

    response['Content-Disposition']= 'attachment; filename=%s.csv' % filename

    这两行是用来处理输出类型和附件的。它表明返回的是一个 csv 格式的文件。

    t =loader.get_template('csv.html')

    c =Context({'data': address,})

    response.write(t.render(c))

    这几行就是最原始的模板使用方法。先通过 loader 来找到需要的模板,然后生成一个 template 对象,再生成一个 Context 对象,它就是一个字典集。然后 t.render(c) 这个用来对模板和提供的变量进行合并处理,生成最终的结果。最后调用 response.write() 将内容写入。

    4   增加templates/csv.html

    {% for rowin data %}"{{ row.0|addslashes}}","{{ row.1|addslashes}}",

    {% endfor %}

    使用了一个 for 循环。这里 data 与上面的 Context data 相对应。因为 data 是一个列表,它的每行是一个 tuple ,因此 row.0, row.1 就是取tuple 的第一个和第二个元素。 | 是一个过滤符,它表示将前一个的处理结果作为输入传入下一个处理。因此 Django 的模板很强大,使用起来也非常直观和方便。 addslashes Django 模板内置的过滤 Tag ,它用来将结果中的特殊字符加上反斜线。同时我们注意到,每个 {{}} 前后都有一个双引号,这样就保证每个字符串使用双引号引起来。然后在第一个与第二个元素之间还使用了逗号分隔。最后 endfor 在下一行,表示上面每行模板后有一个回车。Django 还允许你自定义 Tag ,在 The Djangotemplate language: For Python programmers 文档中有描述。

    5   修改 urls.py

    fromdjango.conf.urls.defaults import *

    urlpatterns= patterns('',

        # Example:

        # (r'^testit/',include('newtest.apps.foo.urls.foo')),

        (r'^$', 'newtest.helloworld.index'),

        (r'^add/$', 'newtest.add.index'),

        (r'^list/$', 'newtest.list.index'),

        (r'^csv/(?P<filename>\w+)/$','newtest.csv_test.output'),

        # Uncomment this for admin:

    #     (r'^admin/',include('django.contrib.admin.urls')),

    )

    增加了 csv url 映射。上面的正则表达式有些复杂了,因为有参数的处理在里面。 (?P<filename>\w+) 这是一个将解析结果起名为 filename 的正则表达式,它完全符合 Python 正则表达式的用法。在最新的 Django 中,还可以简化一下: (\w+) 。但这样需要你的参数是按顺序传入的,在一个方法有多个参数时一定要注意顺序。关于 url的配置问题在 URLconfiguration 文档中有说明。还记得吗?我们的链接是写成 /csv/address/ ,因此上面实际上会变成对 csv.output(filename='address') 的调用。

    6   启动 server:看一下结果吧。点击链接,浏览器会提示你保存文件的。很简单吧。但这里面的内容其实也不少,而且许多地方都有很大的扩展空间。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值