【问题标题】:Django and AJAX: Delete Multiple Items wth Check BoxesDjango 和 AJAX:使用复选框删除多个项目
【发布时间】:2015-02-21 21:27:55
【问题描述】:

我看过几篇描述在 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() 后删除这些图像。

在赏金结束前有什么最后的话吗?

【问题讨论】:

    标签: ajax django checkbox delete-row


    【解决方案1】:

    您的视图是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
    

    【讨论】:

    • 酷,这很好......很好,DeleteView 只适用于一个;我只是添加我现在拥有的代码来显示我正在使用的内容。感谢您的建议。我会试试这个。快速提问,如果我构建了这个视图,我提供的 AJAX 还能工作吗?
    • 您的 ajax 只发送一个 id - 请参阅 data: id 位 - 所以您需要更改它以发送一组 id。
    • 我已经为此苦苦挣扎了一段时间,无法弄清楚如何将这些部分组合在一起。我已经更新了我的 OP。您能否建议一种首选方法并提供一些代码起点?原则上,您在回答中陈述的内容是有道理的;我就是无法拼凑起来。
    • 感谢您的建议。我已经实现了我能做的,但被卡住了。如果您愿意看一下,我更新了我的问题...非常感谢。
    • Craig Blaszczyk - 任何最终的 cmets?我还没有颁发这个赏金。你的回答有帮助,但真的没有让我一路走好......我只是无法让你的作品一起工作,可能是因为我错过了一些东西。
    【解决方案2】:

    您可以选中复选框并将 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")
    

    【讨论】:

    • 这部分没有问题。我可以很好地获取 id 并毫无问题地删除它们。我的问题在于 Django 位...
    • 一旦您获得了 id 列表,您就可以在该列表上运行 for 循环。看看编辑后的答案。
    • @ Gaurav - 您可以使用 CBV 编辑您的答案吗?如果它是我可以使用的东西,我很乐意投票。
    • CBV 的?我没听懂。
    猜你喜欢
    • 2014-08-05
    • 2013-08-13
    • 2011-06-17
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    相关资源
    最近更新 更多