2010-02-03 63 views
3

我是jquery的初学者,请耐心等待。 我有一个jQuery的功能,可以让我选择多个复选框,并创建一个字符串,如下所示:jquery和Django复选框

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字符串没有被处理,只有一半。

请帮帮我!谢谢

+0

你可以使用'$(“input [name ='checks']:checked”)。each'来缩短你的每个函数并删除if语句。 – rahul 2010-02-03 10:40:06

回答

7

从我看到的,你这样做。您应该在所有复选框上设置相同的名称。我不知道你为什么通过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表单。已经有一个复选框列表OOTB。我不确定为什么你甚至考虑在这种情况下使用JavaScript。

+0

谢谢! 但是我再次卡住:(我试图发送上述代码中的“过滤器”作为POST数据到Django,但我无法弄清楚正确的dataType。发布此数据的正确方法是什么,以便django看到列表它可以迭代吗? – spyder 2010-02-03 21:43:21

+0

对不起,在服务器端代码中有一些问题。 – spyder 2010-02-10 20:11:41

2

首先,我不知道您是否需要将复选框值操作为像您正在操作的字符串。如果你为它们分配相同的名称属性,http(或jQuery的)序列化将为你做。

在Django端使用getlist来获取列表,[]访问器只获取参数列表中的最后一个值。

但是,默认处理Http不会通过未选中的复选框的值发送,因此您可能希望构建一些比较您构建的复选框与您获取的数据的检查。

由于Gavoja说以上,Django的形式可能是这方面的一个很好的答案: 具体来说,要使用MultipleChoiceField与CheckboxSelectMultiple配件和选择,因为你的选择:

my_field = forms.MultipleChoiceField(choices=SOME_CHOICES, widget=forms.CheckboxSelectMultiple())

还看到: In Django is there a way to display choices as checkboxes?