При обработке записи формы в Django views.py , похоже, игнорируется тип HttpResponse

#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, он работает так, как задумано. Извините, что трачу чье-либо время.