__init__() получил неожиданный аргумент ключевого слова «заголовки» (Django 3.2)

#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. Это работает, но кажется странным, и у этого подхода есть два довольно существенных недостатка:

  1. Все поля формы на этой веб-странице будут сброшены
  2. Запятые в строках становятся новой ячейкой в файле .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 ?