ajax - Django 和 AJAX : Delete Multiple Items wth Check Boxes

标签 ajax django checkbox delete-row

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

我最初使用的是 Django 的 GCBV,DeleteView ,这适用于单个对象删除。但正如@Craig Blaszczyk 指出的那样,DeleteView只是为了:删除单个对象。所以我需要编写一个新 View 来删除多个对象,并附带一个表单和发送 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(),
    )

这样做的更好方法是什么?我觉得我在没有很好的实践的情况下就闯入了这个解决方案。

此外,即使它似乎有效,我觉得我应该在调用 if form.is_valid() 后删除这些图像。 .

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

最佳答案

您的观点是 DeleteView ,根据定义,它仅适用于一项。为了能够删除多个项目,我建议您创建一个新的 View ,它有一个表单,它需要您想要删除的 id。然后你就可以写一个 ProcessFormView它遍历表单中的 id 并删除每一个。

这是一个示例 View :

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

关于ajax - Django 和 AJAX : Delete Multiple Items wth Check Boxes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27625425/

相关文章:

django - 使用 django-storage 和 boto 保存另一个同名文件

javascript - 仅当使用 jQuery 单击任何复选框时才应启用提交按钮

javascript - jQuery:将复选框的值添加到输入文本字段

javascript - jQuery ajax 调用 OpenWeatherMap - net::ERR_CONNECTION_REFUSED

javascript - 不允许使用 ajax DELETE 方法

python - django 的事件、异常日志记录

ruby - 使用类似 django 的液体 block /继承的 Jekyll 模板

javascript - 使用 id 'user' +i 的复选框切换 id 'checkbox' +i 的属性

javascript - 检查youtube视频id是否存在Javascript

javascript - jquery 响应后滚动顶部保持位置