我试图通过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} }键。
答案 0 :(得分:0)
嗯,经过多个小时的调试和搜索,这个答案(https://stackoverflow.com/a/21016757/1580632)帮助我解决了这个问题。简而言之,在$ .ajax调用中,只需添加:
$.ajax({
...
traditional: true,
...
}
就是这样。