Jquery与Django多重复选框
我刚开始学习jquery,所以请多多包涵。
我写了一个jquery函数,可以让我选择多个复选框,并把这些选中的值组合成一个字符串,格式如下:
function getSelectedVals(){
var tmp =[];
$("input[name='checks']").each(function() {
if ($(this).attr('checked'))
{
checked = ($(this).val());
tmp.push(checked);
}
});
var filters = tmp.join(',');
alert(filters)
return filters;
}
然后我调用了一个django的视图函数,把这个字符串传过去,代码是这样的:
selected = getSelectedVals();
var myurl = "/bills/delete/?id=" + selected;
$.ajax({
type: "GET",
url: myurl,
data: selected,
cache: false
});
在服务器端,我有一个删除的视图函数,它会遍历复选框的值,并对一个列表进行操作。
def delete(request):
global myarray
idx = request.GET[u'id']
listidx = idx.split(',')
for l in listidx:
value = myarray[int(l)]
myarray.remove(value)
return HttpResponse("/bills/jqtut/")
问题是,在服务器上,我发送的GET字符串中的所有索引并没有被处理,只有一半的索引被处理了。
请帮帮我!谢谢!
2 个回答
首先,我不太确定你是否需要像现在这样把复选框的值处理成字符串。如果你给它们分配相同的名字属性,HTTP(或者jQuery)会自动帮你处理这些。
在Django这边,可以用getlist来获取一个列表,因为用[]这种方式只会拿到参数列表中的最后一个值。
不过,HTTP默认的处理方式不会发送未选中的复选框的值,所以你可能需要加一些检查,来对比你创建的复选框和你收到的数据。
正如Gavoja上面提到的,Django表单可能是个不错的解决方案:具体来说,你想用MultipleChoiceField配合CheckboxSelectMultiple这个小部件,并把选项作为你的选择:
my_field = forms.MultipleChoiceField(choices=SOME_CHOICES, widget=forms.CheckboxSelectMultiple())
另外可以看看这个链接:在Django中有没有办法把选项显示为复选框?
从我看到的情况来看,你的做法正好相反。你应该给所有的复选框设置相同的名字。我不太明白你为什么要用GET方式发送数据,我建议你用POST方式。
<input type="checkbox" name="vehicle" value="Bike" />
<input type="checkbox" name="vehicle" value="Car" />
<input type="checkbox" name="vehicle" value="Airplane" />
然后,在你的视图中使用getlist()方法:
def delete(request):
values = request.POST.getlist(u'vehicle')
# Handling goes here.
不过,不管怎样,除非你真的需要做一些特别的事情(不过特别的情况也不应该打破规则;),否则建议使用Django表单。Django已经自带了复选框列表。我不太明白你为什么在这种情况下还考虑使用JavaScript。