【发布时间】:2015-10-28 20:34:07
【问题描述】:
当我尝试使用 DeleteView 和 POST 方法一次删除模型的多个对象时,我认为我正在执行标准操作,中间有一个确认模板。
好吧,要么我在电脑前坐得太久,要么 Django 不直接支持这种所谓的标准方式。
正如Djangos docs 和其他帖子所说,只有在我使用 GET 方法时才会显示确认模板(带有确认按钮)。但在我的情况下,我有一个 ListView,其中包含我模型的所有对象,第一列是复选框,其值对应于相应对象的 ID。 我可以一次检查多个复选框,然后单击我的“删除选定项目”。表单使用 POST 方法(我不想使用 GET)。
现在:在 POST 方法的情况下,让 DeleteView 与确认模板一起工作似乎会引起一些黑客攻击。几个小时后我没有成功。
这里最好的方法是什么?
我的班级的标题是这样的:
class SomeItemConfirmDeleteView(DeleteView):
template_name = 'confirm_delete_someitems.html'
model = SomeItem
success_url = reverse_lazy('list_someitems_url')
items_to_delete = []
目前已完成的步骤:
-
我重写了 POST 方法,以便如果我有一个列表,其中包含来自选中复选框的所有要删除的 ID,我调用 GET 方法以便显示确认模板。否则,confirm_delete_someitems.html 中的“确认删除”按钮已被按下。
def post(self, request, *args, **kwargs): self.items_to_delete = self.request.POST.getlist('itemsToDelete') if not self.items_to_delete: return self.delete(request, *args, **kwargs) else: return self.get(self, *args, **kwargs) -
我重写了 get_object 方法
def get_object(self, queryset=None): return self.get_queryset() -
我重写了 get_queryset 方法,以便将要删除的对象显示在 confirm_delete_someitems.html 的列表中。我从名为“itemsToDelete”的选中复选框中获取对象。
def get_queryset(self): if not self.items_to_delete: queryset = super(ChargeParkConfirmDeleteView, self).get_queryset() self.queryset = # ... HOW TO GET THE OBJECTS TO DELETE?? return self.queryset else: queryset = super(SomeItemConfirmDeleteView, self).get_queryset() self.queryset = queryset.filter(id__in=self.items_to_delete) return self.queryset
最后一步是棘手的地方:如何获取要从 confirm_delete_someitems.html 表单中删除的对象:
<form action="" method="post">
{% csrf_token %}
{% trans 'The following objects as well as their related objects will be deleted. Are you sure?' %}
<ul>
{% for item in object %}
<li>{{ item }}</li>
{% endfor %}
</ul>
<input type="submit" value="{% trans 'Confirm deletion' %}" />
</form>
【问题讨论】:
-
该模板代码是您的实际模板代码吗?我没有看到你提到的复选框。
-
这是confirm_delete_someitems.html的模板代码。复选框所在的另一个模板在这里并不重要。
标签: django post confirmation