Django Forms - 从多个选择字段中获取数据

时间:2012-02-22 22:07:44

标签: django forms get

我有一个这样的表格:

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&params=foo&params=bar&params=something&submit=Query

我的params变量显然被最后一个选择覆盖了吗?如何将提交的数据作为单独的变量进行访问?

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:10)

使用Django表格

应该使用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}))

使用GETPOST表格

的说明

如果你要{% 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

文档

不要忘记查看QueryDictsforms上的Django文档

答案 1 :(得分:1)

在get请求中使用{% csrf_token %}是一种不好的做法。

答案 2 :(得分:0)

使用form.is_valid()form.cleaned_data['params']