Django:编写一个视图以删除带有复选框的项目

Posted

技术标签:

【中文标题】Django:编写一个视图以删除带有复选框的项目【英文标题】:Django: writing a view to delete an item with checkboxes 【发布时间】:2011-06-21 07:16:32 【问题描述】:

我需要帮助编写一个获取 POST 数据的视图,然后找出哪些复选框已被选中,然后从数据库中删除与 id 匹配的项目。 最初,这是一个复选框问题。在编辑订单表单中,有一个项目列表。现在我可以使用一些 javascript 删除该项目,但它没有得到保存,因为我需要从我的数据库中完全删除它。我尝试使用我的编辑订单视图使用 delete() 删除项目,但这不起作用。一定还有其他我做错了,但我不知道是什么。

delete_item = request.POST.get('delete_item', None)
    if request.method == 'POST':
        form = forms.OrderForm(request.POST, instance = order)
        if form.is_valid() and save_item is not None:
            form.save(True)
            request.user.message_set.create(message = "The order has been updated successfully.")
            return HttpResponse("<script language=\"javascript\" type=\"text/javascript\">window.opener.location = window.opener.location; window.close();</script>")

        if status is not None and contact is not None and save_status is not None and delete_item is not None:
            try:
                for id in status_items:
                    item = models.StorageItem.objects.get(pk = id)
                    delete = item
                    delete.delete()
                    current_status = models.ItemStatusHistory(item = item, contact = contact, status = status,
                                                    user = request.user)
                    current_status.save()
            except:
                pass
            request.user.message_set.create(message = "Status successfully changed for 0 items".format(len(status_items)))

% for item in items %
        <tr class="items_table_row">
                <td><input type="checkbox" name="item" value="item.pk" checked="checked"% endif %>
                <td>item.tiptop_id</td><td>item.alternative_id</td><td>item.title</td><td>item.type</td><td>item.format</td>
                <td><span id="item.pk" name="type">item.itemstatushistory_set.latest</span></td><td>item.itemstatushistory_set.latest.date.date|date:"d M Y"</td>
                <td><a href="% url tiptop.views.edit_item item.client.pk item.pk %" onclick="return showAddAnotherPopup(this);">Edit</a></td>
        </tr>
% endfor %

【问题讨论】:

【参考方案1】:

鉴于您的模板使用带有name="item"...的复选框,.delete() 应该可以工作。

Items.objects.filter(id__in=request.POST.getlist('items')).delete()

你遇到异常了吗? delete() 代码是否曾经运行过?输入打印语句。

您有“大量代码”、很多我们不熟悉的条件以及一个 try/except 块,所以我只是想确保视图实际上正在进入删除阶段。

更新:这是一段粗略的代码,不熟悉您的代码。if status is not None and contact is not None and save_status is not None and delete_item is not None:

您为什么不直接检查是否存在按下的特定按钮?

# html
<input type="submit" name="save" value="Save Items" />
<input type="submit" name="delete" value="Delete Items" />

# view
if request.POST.get('delete'):
   Items.objects.filter(id__in=request.POST.getlist('items')).delete()
elif request.POST.get('save'):
   form = Form(request.POST)
# ... so on

【讨论】:

好吧,每当我在 delete() 阶段之后抛出打印语句时,它甚至都不想打印。我假设和你一样。我根本不想进入删除阶段。 是的,那是你的问题。 if status is not None and contact is not None and save_status is not None and delete_item is not None: 是一条很难遵循的路线。为什么我不建议一个更简单的方法.. 更新 这更有意义,但这仍然不起作用。可能与这行 Items.objects.filter(id__in=request.POST.getlist('items')).delete() 有关。实际上项目在我的视图中定义为 items = models.StorageItem.objects.filter(orderstoragelist__order__pk = order.pk) 但即使我将 StorageItem 替换为 Items 它仍然无法删除。 是的,那条看起来很胖的if foo1, foo2, not foo3, foo4 == foo5 行可以替换为:“按下了哪个按钮?” :)

以上是关于Django:编写一个视图以删除带有复选框的项目的主要内容,如果未能解决你的问题,请参考以下文章

删除复选标记

带有复选标记和详细信息披露的表格视图

自定义 listView 行,带有复选框和旋转时的储蓄复选标记

如何编码以选择带有复选标记的多行?

多个复选标记附件在 iOS7 中无法正常工作

Django:使用通用 DeleteView 删除选中的项目?