我不知道如何处理这个问题。我有一个带有两个ModelMultipleChoiceField字段的django表单。它们在网页中正确显示,正确的对象作为选择中的选项。我使用它们为组分配权限,就像django管理站点那样。问题是,当我用jquery拦截submit,并在窗体上调用serializeArray()时,表单中的两个Select元素将从返回的数据中删除,因为元素的val()为null(jquery-1.9.1) .js,第7321行。
表格:
class GroupUpdateForm(forms.Form):
group_id = forms.IntegerField(label='', required=False)
avail_perms = forms.ModelMultipleChoiceField(queryset=Permission.objects.none(), \
label='Available Permissions')
assign_perms = forms.ModelMultipleChoiceField(queryset=Permission.objects.none(), \
label='Assigned Permissions')
name = forms.CharField(label='Group Name', required=True)
def __init__(self, *args, **kwargs):
self.group = kwargs.pop('group', None)
super (GroupUpdateForm, self).__init__(*args, **kwargs)
has_perms = self.group.permissions.all()
self.fields['assign_perms'].queryset = self.group.permissions.all()
self.fields['avail_perms'].queryset = Permission.objects.all().exclude(id__in=has_perms)
我的javascript目前非常基础,可以追踪问题:
function saveGroupPermissions() {
var dataArray = $('#groupEditForm').serializeArray();
$.post('/sdc/admin/editGroup/' + parseInt($('#group_id').text()) + '/', dataArray, function(data){
return true;
});
}
我的选择是什么,或者如何阻止我的选择被删除,以便我可以发布它们?
编辑: 刚试过没有jQuery,同样的事情正在发生。常规提交将从POST和正文中删除两个ModelMultipleChoiceField选择。我哪里错了?
编辑2: 我试图强制dataArray包含像这样的Select值(更新的javascript文件),但是dataArray现在包含一个添加权限的对象
"["chargeback | category | Can add category"]"
当它到达视图时,request.POST不包含该对象。
function saveGroupPermissions() {
var dataArray = $('#groupEditForm').serializeArray();
//get all the added permissions and the removed permissions
var added = $('.assignedPerm.added')
var addedNames = new Array();
if (added.length > 0) {
for (var i=0; i < added.length; i++){
addedNames.push(added[i].innerHTML);
}
}
var jAdded = JSON.stringify(addedNames);
var addedData = {
name:'addedData',
value:jAdded
}
dataArray.push(addedData);
$.post('/sdc/admin/editGroup/' + parseInt($('#group_id').text()) + '/', dataArray, function(data){
return true;
});
}
答案 0 :(得分:0)
似乎由于未选择选项元素,因此select不会给POST任何值,无论是否jQuery。我必须通过jQuery强制添加或删除要选择的选项元素
$('.added').prop('selected', true);
$('.removed').prop('selected', true);
一旦我这样做,一切正常。