我正在构建一个网页,以便为用户显示一个表格。我想提供一个表单,以便用户可以选择显示每页有多少项(并且还有一个隐藏字段来告诉服务器用户所在的页面)。我试图为表单设置初始值,但它不起作用:
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'].errors
和form.['page'].errors
,发现它们是This field is required.
我也尝试将其更改为:
if form.is_valid():
cd = form.cleaned_data
else:
cd = {'itemPerPage': "20", 'page': "1"}
但我仍然在页面上看到This field is required.
。
为什么初始值不起作用?
答案 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})