#python #django #csv #httpresponse #forms #http-post
#python #django #csv #httpresponse #формы #http-post
Вопрос:
У меня есть приложение Django, которое генерирует таблицу данных. У меня есть форма, в которой вы вводите параметры и нажимаете одну кнопку, чтобы увидеть результаты, или другую, чтобы загрузить CSV. Просмотр результатов работает, но загрузка CSV-файла — нет.
Я обрабатываю ответ в views.py , установите тип содержимого и расположение и верните ответ. Вместо загрузки CSV он отображает данные в виде текста. (Я пробовал как StreamingHttpResponse, так и обычный HttpResponse.) Тот же точный код работает при обработке URL, передаваемого в параметрах. Итак, вместо этого я попробовал HttpResponseRedirect , и он ничего не делает. Я даже пытался просто перенаправить на простой URL, без эффекта. Я считаю, что тип ответа игнорируется, но я не знаю почему.
HTML:
<form action="" method="post" class="form" id="form1">
{{ form.days }} {{ form.bgguserid }}
<input type="submit" value="Go!" id="button-blue"/>
<input type="submit" name="csv-button" value="CSV" id="csv-button"/>
</form>
views.py попытка 1:
def listgames(request, bgguserid, days=360):
if 'csv-button' in request.POST:
# create CSV in variable wb
response = StreamingHttpResponse(wb, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="collectionvalue.csv"'
return response
попытка 2, то же самое, но с:
response = HttpResponseRedirect ('/collection/{0}/csv/{1}/'.format(bgguserid,days))
Я открыт для других решений, таких как перенаправление на стороне клиента на функционирующий URL, но я не хочу терять проверку формы, а мои навыки HTML / javascript слабы.
Комментарии:
1. Есть ли у вас какой-либо JavaScript, задействованный в отправке этой формы?
2. Вы пробовали делать это как документы? docs.djangoproject.com/en/2.2/howto/outputting-csv (если вы используете
StreamingHttpResponse
, первый аргумент должен быть итерируемым из байтовых строк).3. В форме нет javascript.
4. CSV генерируется методом to_csv фрейма данных pandas, поэтому я не пишу его построчно. Обратите внимание, что тот же код работает (загружает CSV) при вызове напрямую по URL.
Ответ №1:
Я разобрался с проблемой. Код в views.py (который я частично скопировал откуда-то) создавал новый объект HttpRequest из возвращаемого значения метода обработки формы.
def indexform(request):
if request.method == 'POST':
form = IndexForm(request.POST)
# Check if the form is valid:
if form.is_valid():
# process the data in form.cleaned_data as required
response = listgames(request, bgguserid=form.cleaned_data['bgguserid'], days=form.cleaned_data['days'])
# redirect to a new URL:
return HttpRequest(response)
Изменив эту последнюю строку на просто return response, он работает так, как задумано. Извините, что трачу чье-либо время.