2010-09-24 75 views
0

我想使用django模板系统来输出类似于csv的数据;输出django模板中的转义字符

!connection%block 
!dosomething 
!dosomethingelse 
My,Header,Row,Which,Is,Comma,Seperated 
All,My,Comma,Seperated,Data 
All,My,Comma,Seperated,Data 
All,My,Comma,Seperated,Data 
All,My,Comma,Seperated,Data 
!Footerblock 
!that has footer information 

实际的模板看起来像:

!connection%[email protected] 
id,account,product,quantity,price,date 
{% for r in records %} 
    {{ r.id }},{{ r.account }},{{ r.product }},{{ r.quantity }},{{ r.price }} 
{% endfor %} 
!endtransactions 

documentation为CSV的建议或者使用csv模块或模板。我的特殊需求更适合模板,因为某些模型字段需要使用我创建的标签库进行一些操作。

我的看法很简单

result['transactions'] = Transasctions.objects.all() 
rendered = render_to_string('trans.csv', result) 
response = HttpResponse(rendered , mimetype='text/csv') 

response['Content-Disposition'] = 'attachment; filename=trans.csv' 
return response 

然而渲染模板没有实际输出DOS CRLF换行符所以整个文件是一个长行的方式!必须有输出\ r \ n字符的方法...

+0

你目前的'trans.csv'模板是什么样的? – codekoala 2010-09-24 15:37:14

+0

我已经编辑了上面的内容来显示我的模板 - 不管我做什么我只是无法获得新的行:/ – m0nonoke 2010-09-27 08:18:36

回答

1

Django模板系统通常不会删除换行符。你的模板中有{%spaceless%}吗?如果不是,则应在响应中输出trans.csv文件中的任何换行符。尽管如此,让这些空白问题更正确可能会非常棘手,因为空间和缩进模板代码的方式可能与您希望输出间隔不同的方式相同。

在这里分享trans.csv可以更容易地评论发生了什么。

+0

没有{ %spaceless%}作为上面的模板显示 - 我发现的是输出是unix换行符而不是windows换行符! – m0nonoke 2010-09-27 08:25:58

+0

然后只需在您的视图函数中添加:rendered = rendered.replace(“\ n”,“\ r \ n”)即可。 – 2010-09-27 11:10:50

0

我建议您使用csv模块。您可以更改和定义方言,引用等。如果您选择模板,引用可能有点棘手。

至于你的问题,试试这个:

return render_to_response('trans.csv',{'transactions': Transactions.objects.all(), "newline_char": "\n"}, mimetype='text/csv')

,并在模板:

{%for row in transactions%}{{row.name_of_field1}} {{row.name_of_field2}} {{row.name_of_field3}}... {{newline_char}}{%endfor%}

+0

感谢您的回复,但这只是在文本文件中输出“\ n” – m0nonoke 2010-09-27 08:24:15

2

使用render_to_string而不是render_to_response,并作为模板使用普通的TXT文件不HTML一个。它将保存有关换行符等的数据。