我有一个这样的表格:
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()
)
Run Code Online (Sandbox Code Playgroud)
在我的模板中:
<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>
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我将表单作为GET提交时,变量如下所示:
site=1¶ms=foo¶ms=bar¶ms=something&submit=Query
Run Code Online (Sandbox Code Playgroud)
我的params变量显然被最后的选择覆盖了吗?如何将提交的数据作为单独的变量进行访问?
任何帮助赞赏.
Tho*_*zco 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}))
Run Code Online (Sandbox Code Playgroud)
GETvs POST与表单的注意事项{% csrf_token %}如果您要GET使用表单,则无用包含(绝对没有csrf验证是通过GET请求完成的,这是有意义的,因为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})
Run Code Online (Sandbox Code Playgroud)
最后,使用GET提交数据通常是不好的做法,除非你创建一些搜索功能或改变显示(分页和所有).
request.GET现在,如果由于某种原因你不想使用Django表单,你仍然可以解决问题并检索你的params,你只需要使用QueryDict.getlist而不是使用QueryDict.get方法.
开始:
my_data = request.GET.getlist('params')
Run Code Online (Sandbox Code Playgroud)
不要忘记对检查出的Django文档QueryDicts和forms