当处理Django中views.py中的表单POST时,它似乎忽略了HttpResponse类别。

2024-09-24 02:24:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django应用程序,它生成一个数据表。我有一个窗体,您可以在其中输入参数,然后单击一个按钮查看结果,或者单击另一个按钮下载CSV。看到结果是可行的,但下载CSV不是

我在views.py中处理响应,设置内容类型和配置,然后返回响应。它不下载CSV,而是将数据显示为文本(我尝试了StreamingHttpResponse和纯HttpResponse。)在处理传入参数的URL时,同样的代码可以工作。所以,我尝试了一个HttpResponseRedirect,但它什么也没做。我甚至试着只重定向到一个普通的网址,没有效果。我相信响应类型被忽略了,但我不知道为什么

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>

视图.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技能很弱


Tags: csvformidurl类型参数responsetype
1条回答
网友
1楼 · 发布于 2024-09-24 02:24:18

我解决了问题。 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)

通过将最后一行更改为只返回响应,它可以按预期工作。抱歉浪费了大家的时间

相关问题 更多 >