我有一个这样的表格:
class MyForm(forms.Form):
site = forms.ChoiceField(choices=SITE_CHOICES, label=ugettext_lazy('Site'),)
...
params = forms.MultipleChoiceField(
choices=PARAM_CHOICES,
label=ugettext_lazy('Select Parameters'),
widget=forms.CheckboxSelectMultiple()
)
在我的模板中:
<form action="{% url results %}" method="get">{% csrf_token %}
{% for field in myform %}
<div class="field_wrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
</div>
{% endfor %}
<input type="submit" name="submit" value="{% trans 'Query' %}" />
</form>
我的问题是,当我将表单作为GET提交时,变量如下所示:
site=1¶ms=foo¶ms=bar¶ms=something&submit=Query
我的params
变量显然被最后一个选择覆盖了吗?如何将提交的数据作为单独的变量进行访问?
任何帮助表示感谢。
答案 0 :(得分:10)
你应该使用Django的表单处理POST
,这会让事情变得更容易。这是:
if request.method == 'GET':
form = MyFormClass()
else:
form = MyFormClass(request.POST)
if form.is_valid():
do_something_with(form.cleaned_data['params'])
return redirect('somewhere')
return render_to_response('my_template.html', RequestContext(request, {'form':form}))
GET
与POST
表格如果你要{% csrf_token %}
表单,那么包含GET
是没用的(绝对没有对GET
请求进行csrf验证,这有意义,GET
请求应该是非数据更改的。
无论如何,如果你真的要去GET
页面,你仍然可以使用与之前编写的相同的逻辑,只需稍加调整:
form = MyFormClass(request.GET)
if form.is_valid():
do_something_with(form.cleaned_data['params'])
return render_to_response('some_template.html', {'stuff':some_stuff})
return render_to_response('form_submission_page.html', {'form':form})
最后,使用GET
提交数据通常是不好的做法,除非您正在创建一些搜索功能或更改显示(分页和全部)。
request.GET
现在,如果由于某种原因你不想使用Django表单,你仍然可以解决问题并检索params
,你只需要使用{{ 1}}而不是使用QueryDict.getlist
方法。
这里是:
QueryDict.get
不要忘记查看QueryDicts
和forms
上的Django文档
答案 1 :(得分:1)
在get请求中使用{% csrf_token %}
是一种不好的做法。
答案 2 :(得分:0)
使用form.is_valid()
和form.cleaned_data['params']
。