【问题标题】:Django Forms - getting data from multiple choice fieldsDjango Forms - 从多项选择字段中获取数据
【发布时间】:2012-03-13 07:35:40
【问题描述】:

我有这样的表格:

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 变量显然被最后一个选择覆盖了?如何将提交的数据作为单独的变量访问?

任何帮助表示赞赏。

【问题讨论】:

  • 您是否实际测试过它,或者您只是对 URL 做出假设?对于MultipleChoiceField,结果应该是request.GET['params'] 中提交值的列表。它是一个列表还是只是最后一个param
  • 好的——我的错。变量实际上作为列表传递给 GET。我确实检查过,但我的方法有问题。

标签: django forms get


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用 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 的注意事项

      如果您要转到GET 表单,则包含{% csrf_token %} 是没有用的(绝对没有对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,您只需使用 QueryDict.getlist 代替使用QueryDict.get 方法。

      这里是:

      my_data = request.GET.getlist('params')
      

      文档

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

      【讨论】:

      • 您好,感谢您的建议。我不太清楚的一点是GETPOST 的使用。我一直认为提交的不改变数据库的数据应该是GET(如获取数据),POST 用于更新/更改数据库。在这种情况下,我有一个仅用于搜索的表单,这使我得出结论,我应该使用GET
      • 如果您确实要提交搜索表单,GET 是合适的使用方法。包含一个关于如何使用带有GET-only 页面的表单的 sn-p。
      猜你喜欢
      • 2018-05-06
      • 2017-01-11
      • 2011-02-13
      • 2013-12-27
      • 1970-01-01
      • 2017-01-05
      • 2018-07-16
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多