При обработке формы POST в Django views.py, похоже, игнорируется тип HttpResponse - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть приложение 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 Ответ

0 голосов
/ 25 апреля 2019

Я разобрался в проблеме.Код в 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)

Изменяя эту последнюю строку, чтобы просто вернуть ответ, она работает как задумано.Извините, что зря потратил время.

...