我看过几篇文章,描述了在 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/