Django使用复选框形成ajax帖子

时间:2014-01-16 19:44:13

标签: ajax django jquery django-forms

我试图通过AJAX发布一个选中了多个复选框的Django表单。选中一个复选框后,一切正常。如果选择了多个,则不会保存任何内容。我猜这是因为我在发送到服务器之前如何在JS中组织我的数据。

有问题的模型是:

class Room(models.Model):
    hotel = models.ForeignKey(Hotel)
    name = models.CharField(max_length=32)
    capacity = models.IntegerField(
        choices=((i, i) for i in range(1, 31)),
        default=3)
    taxes = models.ManyToManyField(
        Tax, related_name='room',
        blank=True, limit_choices_to={'hotel': F('hotel')})

创建或编辑房间的表格是:

class RoomForm(forms.ModelForm):
    name = forms.CharField(widget=forms.TextInput)

    class Meta():
        model = Room
        fields = ('name', 'capacity', 'taxes')
        widgets = {
            'capacity': forms.Select,
            'taxes': forms.CheckboxSelectMultiple,
        }

    def __init__(self, *args, **kwargs):
        super(RoomForm, self).__init__(*args, **kwargs)
        if 'initial' in kwargs:
            self.fields['taxes'].queryset = Tax.objects.filter(hotel=kwargs['initial']['hotel'])

我通过像这样的ajax发布表单:

var elements = $('form').serializeArray();
var params = {}, i;
for (i in elements) {
    element = elements[i];
    if (element.name in params) {
        if (!(params[element.name] instanceof Array)) {
            params[element.name] = Array(params[element.name]);
        }
        params[element.name].push(element.value);
    } else {
        params[element.name] = element.value;
    }
}
params['csrfmiddlewaretoken'] = CSRF_TOKEN;

$.post(e.target.action, params, function(response) {
    callback(response);
});

当选择并发布一个税收复选框时,它可以完美地运行。但是,当选择多个税时,django会收到request.POST,如下所示:

{..., u'taxes[]': [u'269', u'268', u'156'], ...}

而不是:

{..., u'taxes': [u'269', u'268', u'156'], ...}

因此,表格已经过验证,但不会节省税金...... :(

另一个注意事项:我在发布表单之前尝试使用断点跳转并且params对象没有taxes[]键,但它确实有一个{{1} }键。

1 个答案:

答案 0 :(得分:0)

嗯,经过多个小时的调试和搜索,这个答案(https://stackoverflow.com/a/21016757/1580632)帮助我解决了这个问题。简而言之,在$ .ajax调用中,只需添加:

$.ajax({
    ...
    traditional: true,
    ...
}

就是这样。