#python #django #django-views #httpresponse
Вопрос:
В моем веб-приложении django я создаю файл .csv из списка в моем views.py и я хочу, чтобы пользователь мог загрузить его, когда нажата кнопка. Однако, когда это выполняется, я получаю сообщение об ошибке, что «заголовки» являются неожиданным аргументом.
Это код в моем views.py:
output = ['a', 'b', 'c']
response = HttpResponse(content_type='text/csv', headers={'Content-Disposition': 'attachment; filename="myfile.csv"'})
writer = csv.writer(response)
writer.writerows(output)
return response
Я понятия не имею, почему это не работает, так как в прошлом я успешно использовал идентичный код в других местах. Кто-нибудь знает, может ли это быть проблемой с поддержкой браузера?
Комментарии:
1. Скорее всего, вы где-то импортировали a
HttpResponse
из другого модуля, такой, которыйHttpResponse
больше не указывает на класс вdjango.http
модуле, а где-то еще.2. Можете ли вы
print(HttpResponse.__qualname__)
в верхней части строки скрипта (перед строкойoutput = ...
), это покажет вам, из какого пакетаHttpResponse
он исходит.3. HttpResponse по-прежнему указывает на django.http…
4. Вы уверены, что именно здесь возникает ошибка? Вы можете опубликовать полную обратную запись?
Ответ №1:
Я смог заставить это работать (но не совсем). Я передаю выходные данные на ту же веб-страницу в шаблоне в формате JSON. Затем я загружаю содержимое этого шаблона с помощью JavaScript. Это работает, но кажется странным, и у этого подхода есть два довольно существенных недостатка:
- Все поля формы на этой веб-странице будут сброшены
- Запятые в строках становятся новой ячейкой в файле .csv, сдвигая все после этого вправо.
views.py
output = json.dumps(output)
form = MyForm(initial={'data':my_data})
return render(request, 'wireCalculator/chassis.html', {'base':base, 'download':output, 'form':form})
добавление html-страницы:
<div style="display: none;">
<p id="download">{{ download }}</p>
</div>
Добавление Javascript:
function download(filename, text) {
// creates a link, downloads it, then deletes the link
var element = document.createElement('a')
element.setAttribute('href', 'data:text/plain;charset=utf-8,' encodeURIComponent(text))
element.setAttribute('download', filename)
element.style.display = 'none'
document.body.appendChild(element)
element.click()
document.body.removeChild(element)
}
const download = JSON.parse(document.getElementById("download").innerHTML)
if (download != "") {
var downloadText = ""
for (i=0; i < download.length; i ){
downloadText = downloadText.concat(download[i])
downloadText = downloadText.concat("n")
}
download("filename.csv", downloadText)
}
Ответ №2:
Другой способ установить заголовок для HttpResponse
этого выглядит следующим образом:
response['Content-Disposition'] = 'attachment; filename="myfile.csv"'
Что касается ошибки, которую вы получаете, можете ли вы дважды проверить, действительно ли ваша версия django 3.2
?