Django中表单字段的初始值不起作用

时间:2015-08-08 07:59:27

标签: django forms

我正在构建一个网页,以便为用户显示一个表格。我想提供一个表单,以便用户可以选择显示每页有多少项(并且还有一个隐藏字段来告诉服务器用户所在的页面)。我试图为表单设置初始值,但它不起作用:

class tablePageSettingsForm(forms.Form):
    itemPerPage = forms.ChoiceField(initial = ('20', '20'), label = "item per page", choices = (("10", "10"), ("20", "20")), required = False) #50, 100, 150, 200), initial = 20)
    page = forms.IntegerField(initial = 1, widget=forms.HiddenInput(), required = False)

python代码在这里:

if request.method == 'GET':
    form = tablePageSettingsForm(request.GET)
else:
    form = tablePageSettingsForm()

if form.is_valid():
    cd = form.cleaned_data
else:
    raise Http404()
# ...

当我访问此页面时,我总是得到Http404。

我在raise Http404()之前设置了一个断言来检查form.['itemPerPage'].errorsform.['page'].errors,发现它们是This field is required.

我也尝试将其更改为:

if form.is_valid():
    cd = form.cleaned_data
else:
    cd = {'itemPerPage': "20", 'page': "1"}

但我仍然在页面上看到This field is required.

为什么初始值不起作用?

1 个答案:

答案 0 :(得分:1)

这里的流程是完全错误的。表单永远不会仅对初始数据有效,如果表单无效,则不应提出404。另外,这里的请求只能是GET,所以你的第一个if语句是没有意义的。

要使用GET处理表单,您需要在提交的数据中包含允许Django确定表单已提交的内容。因此,您可以在模板中执行此操作:

<form action="." method="GET">
    {{ form }}
    <input type="submit" name="submit" value="Whatever">
</form>

现在,您可以根据“提交”是否在数据中进行切换:

if "submit" in request.GET:
    form = tablePageSettingsForm(request.GET)
    if form.is_valid():
        cd = form.cleaned_data
        ... do something with cd and redirect ...
else:
    form = tablePageSettingsForm()
return render(request, 'template.html', {'form': form})