Django和AJAX:使用复选框删除多个项目

时间:2014-12-23 17:43:30

标签: ajax django checkbox delete-row

我看过几篇帖子描述了在Django中删除带有视图和复选框的项目。我已经完成了用AJAX删除单个项目。我目前的问题是我无法弄清楚如何在我的Django应用程序中使用复选框和AJAX删除多个项目。

我最初使用的是Django的GCBV,DeleteView,这适用于单对象删除。但正如@Craig Blaszczyk指出的那样,DeleteView就是这样:删除一个对象。所以我需要编写一个新视图来删除带有附带表单的多个对象以及发送ids数组的AJAX调用。

我有这个工作,但它感觉笨重,并没有很好地工作。我的AJAX脚本在这里:

$.ajax({
    type: 'POST',
    url: '/dashboard/images/delete/',
    data: {'ids': ids},
    success: function() {
        console.log(date_time + ": AJAX call succeeded.");
    },
    error: function() {
        console.log(date_time + ": AJAX call failed!");
        console.log(date_time + ": Image ID: " + ids + ".");
    }
});

在这个脚本中(在此处显示的部分之上),我构建了一个id数组并作为数据发送。

所以在我的CBV中,我收集了所选的ID并删除了它们:

def post(self, request, *args, **kwargs):    
    form = self.form_class(request.POST)
    GalleryImage.objects.filter(pk__in=request.POST.getlist('ids[]')).delete()
    return render(request, self.template_name, {'form': form})

以下是我使用的表格:

class DeleteImagesForm(forms.Form):
    ids = forms.ModelMultipleChoiceField(
        queryset=GalleryImage.objects.all(),
        widget=forms.CheckboxSelectMultiple(),
    )

有什么更好的方法可以做到这一点?我觉得如果没有很好的实践,我就会破解我的解决方案。

此外,即使它似乎工作,我觉得我应该在致电form.is_valid()之后删除这些图片。

赏金结束前的最后一句话是什么?

2 个答案:

答案 0 :(得分:3)

您的观点是DeleteView,根据定义,它只适用于一个项目。为了能够删除多个项目,我建议您创建一个新的View,其中包含一个需要您要删除的ID的表单。然后,您就可以编写一个ProcessFormView来迭代表单中的ID并删除每个。

以下是示例视图:

class MyView(FormView):
    form_class = MyForm
    template_name = 'mytemplate.html'

    def form_valid(self, form):
        # Process your ids here
        print form.cleaned_data['ids']
        # Prints [u'1', u'2']
        return super(MyView, self).form_valid(form)

    def get_form_kwargs(self):
        form_kwargs = super(MyView, self).get_form_kwargs()
        query =  Image.objects.all().values_list('id', flat=True)
        form_kwargs['image_ids'] = [(image_id, image_id) for image_id in query]
        return form_kwargs

样本表格:

class MyForm(forms.Form):
    # This might be better as a ModelChoiecField
    ids = forms.MultipleChoiceField()#

    def __init__(self, image_ids, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.fields['ids'].choices = image_ids

答案 1 :(得分:0)

您可以选择复选框并将id的值存储在一个数组中,并将该数组设置为输入标记的值。

实施例

function updateTextAreanew() {
  var allVals = [];
    $('.questions_checkbox :checked').each(function() {
          allVals.push($(this).next().val());
    });
  $('.ups1').val(allVals);

}

$(function() {
  $('.questions_checkbox input').click(updateTextAreanew);

    updateTextAreanew();
});

这里我们检测复选框点击并在allVals数组中存储值。

现在发送这个包含所有id的数组,使用ajax查看并在视图中运行for循环并删除该对象。

视图中的

@csrf_exempt
def deleteitems(request):
    newdata = request.user
    profiledata = UserProfile.objects.get(user=newdata)
    swid = request.POST.getlist('newval[]') # ajax post data (which have all id's of GalleryImage objects)
    for one in swid:
        obj = GalleryImage.objects.get(id=one).delete()
    response = json.dumps({'data':'deleted'})
    return HttpResponse(response, mimetype="application/json")