首页 > 解决方案 > Django删除项目用例:好的做法?

问题描述

小笼统的解释。
我是 Django 的新手,我有一点知识,但没有经验。我想问的代码正在运行,但我有一个关于好/坏做法的问题。我的方法是好的还是至少不错?

小用例说明。
我有一个包含这些项目的网站。有添加项目的功能,现在我想添加删除项目的可能性。
用例:在项目页面上,用户单击删除按钮,我们将显示一个页面,其中包含有关该项目的详细信息以及底部的“确认删除”按钮。如果用户单击按钮,我会从数据库中删除该项目。

所以

  1. 我在urls.py中创建

path('item/delete/<int:id>/', views.delete_item, {}, 'delete_item'),

  1. 我在views.py中创建
def delete_item(request,id):
    if id :
        cur_item = get_object_or_404(Item, pk=id)
    else : 
        raise Http404

    if request.POST:
        try :
            post_item_id=int(request.POST["pk"])
        except ValueError :
            messages.error(request,"Wrong id number")
            return render(request, 'myapp/item_delete_form.html', {'cur_item': cur_item})

        if (request.POST["delete"] == "yes") and (post_item_id == id):

            Item.objects.filter(pk=id).delete()
            # Delete was successful, so redirect to another page
            redirect_url = reverse('items')
            return redirect(redirect_url)
        else:
            messages.error(request, "id number in form not the same as in URL")
            return render(request, 'myapp/item_delete_form.html', {'cur_item' : cur_item})

    return render(request, 'myapp/item_delete_form.html', {'cur_item' : cur_item})
  1. 我不使用 Django 表单,因为它不是真正的 Django 表单(即它没有链接到模型)。正如@akx 在评论中提到的那样,我总是可以直接基于 forms.Form 创建一个表单。但这对我来说似乎也没用,因为实际上我的表格中几乎没有数据。
    相反,我只是在模板中创建通用表单。在模板/myapp/item_delete_form.html

模板的第一部分获取 cur_item 并显示它。接着 :

<form method="post">
   {% csrf_token %}
   <input type="hidden" value="{{ cur_item.id }}" name="pk">
   <input class="btn btn-default btn-danger" name="delete" type="submit" value="yes"/>
</form>
  1. 最后在这里进行小测试来检查它:
def test_delete_item(self):
     test_serial = "111-111"
     new_item = Item(serial_number=test_serial)
     new_item.save()

     url = reverse("delete_item", kwargs={'id':new_item.id})
     resp = self.client.get(url)
     confirm_data = {'pk': new_item.id,'delete': 'yes'}
     resp = self.client.post(url, confirm_data)
     self.assertEqual(Item.objects.all().count(), 0)

虽然我将非常感谢您对我的认识发表评论,但这里有一些实际问题。

分析 request.POST 列表的做法不是“坏做法”吗?因为我不使用 Django 表单,所以我无法使用 form.is_valid。可以吗?

是否有一些我应该考虑的陷阱(例如,用户是否有权删除此项目,但目前用户系统尚未开发,因此我对此无能为力)?

我的测试是否相关?

最后,如果我的实现不是一个好的或可接受的实践,我应该如何做我的用例?

标签: pythondjango

解决方案


DeleteView只需使用 Django 的默认CBV,您就可以省去很多麻烦:

网址.py

path('item/delete/<int:pk>/', DeleteItemView.as_view(), name='delete_item'),

视图.py

class DeleteItemView(DeleteView):
    model = Item
    template_name = "myapp/item_delete_form.html"
    success_url = reverse_lazy('items')

item_delete_form.html

<form method="post">
   {% csrf_token %}
   <input class="btn btn-default btn-danger" name="delete" type="submit" value="yes" />
</form>

实际上,您甚至不一定需要views.py. 只需在其中设置 CBV 的参数即可urls.py...

path(
    "item/delete/<int:pk>/",
    DeleteView.as_view(
        model=Item,
        template_name="myapp/item_delete_form.html",
        success_url=reverse_lazy("items"),
    ),
    name="delete_item",
)

将是等效的。


推荐阅读