Вывод экранированных символов в шаблонах Django - PullRequest
0 голосов
/ 24 сентября 2010

Я хочу использовать систему шаблонов django для вывода данных в формате csv, которые выглядят так:

!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%special@oracleconnectionstring
id,account,product,quantity,price,date
{% for r in records %}
    {{ r.id }},{{ r.account }},{{ r.product }},{{ r.quantity }},{{ r.price }}
{% endfor %}
!endtransactions

Документация для 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 ...

Ответы [ 3 ]

2 голосов
/ 24 сентября 2010

Используйте render_to_string вместо render_to_response, а в качестве шаблона используйте обычный TXT-файл, а не HTML-файл.Он будет содержать данные о символах перевода строки и т. Д.

1 голос
/ 26 сентября 2010

Система шаблонов Django обычно не удаляет переводы строки. У вас есть {% spaceless%} в вашем шаблоне? Если нет, то любая новая строка в вашем файле trans.csv должна выводиться в вашем ответе. Однако может быть сложно получить правильные ответы на подобные проблемы, связанные с пробелами, поскольку ваш пробел и код шаблона отступа могут не совпадать с тем, как вы хотите, чтобы вывод выводился на расстоянии.

Совместное использование trans.csv поможет вам прокомментировать происходящее.

0 голосов
/ 24 сентября 2010

Я рекомендую вам использовать модуль 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%}

...