通过JQuery .val()</select>将多个数据字段从<select multiple =“”>传递到Django formfield

时间:2011-11-04 04:40:14

标签: jquery django django-forms multi-select

我有一个应用程序,我有很多实例将单个html选择的用户选择传递给表单字段没有问题,但我在多选案例中努力做同样的事情。似乎JQuery.val()函数正在创建一个正确的数据数组,但我在服务器上的表单字段显示一个空字符串。我继承了这个应用程序,并且在某种程度上是一个菜鸟。

相关的javascript函数是

$('.exemptionfield').change(function() {
    var exemptionfield = $(this)

    $.ajax({
        url: '/form/ASubstanceExemption',
        type: 'POST',
        data: {
            sclId: $('#sclId').val(),
            substance: exemptionfield.attr('id'),
            exemption: exemptionfield.val()
        }
    })
})

表单看起来像

class ASubstanceExemption(forms.Form):
   buttonTitle = 'submit'
   title = 'not used'

   sclId = forms.IntegerField()
   substance = forms.CharField()
   exemption = forms.MultipleChoiceField(required=False,
                            choices=kExemptions)
   def handle(self, *args, **kwargs):
      sclId = self.cleaned_data['sclId']
      substance = self.cleaned_data['substance']
      exemption = self.cleaned_data['exemption']
      print exemption
etc...

HTML选择看起来像

<select multiple size="5" class="exemptionfield" id="Lead/lead compounds">
<option value="1(a)">
    1(a)
</option>
<option value="1(b)">
    1(b)
</option>
<option value="1(c)">
    1(c)
</option>
<option value="1(d)">
    1(d)
</option>
etc....

如果我有一个选择html下拉菜单和一个选项form.ChoiceField,选定的值(类型为exemptionfield)将传递给我的表单中的免除变量。从来没有遇到过问题。如果我切换到form.MultipleChoiceField并选择要在exemptionfield.val()[0]中传递的单个变量,例如,这也可以正常工作。它将以(示例)[u'1(b)']的格式出现。但是,当我删除[0]并且仅使用exemptionfield.val()时,我似乎只在表单中收到一个空数组。我的打印操作仅显示[]。但是查看javascript使用提醒功能发送的值,它会告诉我它正在发送1(b)1(c)1(d)

我在这里出错的任何提示? 感谢。

1 个答案:

答案 0 :(得分:5)

认为你遇到了我刚解决的同样问题。您只需要更改jQuery中的设置(从v1.4开始,按照this discussion更新,并在jQuery docs中引用),以便它不会将方括号附加到发送的序列化变量在POST数据中。

当我使用my-form-field = $('#my-multi-select').val()发送.post()时,它将其发送为:

my-form-field[] = 4
my-form-field[] = 7

尝试将此引用为form.cleaned_data ['my-form-field []']而不是form.cleaned_data ['my-form-field']不起作用,Django只查找表单字段名称括号。

无论如何,添加这一行:

jQuery.ajaxSettings.traditional = true;

...将使其以

的形式发送数据
my-form-field = 4
my-form-field = 7

根据我在上面讨论的讨论中收集的内容,默认行为在PHP和Rails中效果更好,但是导致Django出现此问题。也许Django应该适应?