Python Django删除项用例:良好实践?

Python Django删除项用例:良好实践?,python,django,Python,Django,很少有一般性的解释。 我是Django的新手,我有一点知识,但没有经验。我想问的代码正在运行,但我有一个关于好/坏实践的问题。我的方法是好的还是至少还不错 很少有用例解释。 我有一个项目的网站。有一个添加项目的功能,现在我想添加一个删除项目的可能性。 用例:在项目页面上,用户单击按钮删除,我们将显示一个页面,其中包含关于该项目的详细信息,并在底部显示按钮“确认删除”。如果用户单击按钮,我将从数据库中删除此项 所以 我在url.py中创建 path('item/delete/',views.del

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

很少有用例解释。
我有一个项目的网站。有一个添加项目的功能,现在我想添加一个删除项目的可能性。
用例:在项目页面上,用户单击按钮删除,我们将显示一个页面,其中包含关于该项目的详细信息,并在底部显示按钮“确认删除”。如果用户单击按钮,我将从数据库中删除此项

所以

  • 我在url.py中创建
  • path('item/delete/',views.delete_item,{},'delete_item'),

  • 我在视图中创建.py
  • 我不使用Django表单,因为对我来说,它不是真正的Django表单(即,它没有链接到模型)。正如@akx在评论中提到的,我总是可以直接基于forms.Form创建一个表单。但它对我来说似乎也没用,因为事实上我的表单中几乎没有数据。
    相反,我只是在模板中创建泛型表单。 在模板/myapp/item\u delete\u form.html中
  • 模板的第一部分获取cur_项并显示它。然后:

    <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>
    
    虽然我非常感谢您对我的认识提出意见和建议,但这里有一些实际问题

    分析request.POST列表的实践不是“坏实践”吗? 由于我不使用Django表单,因此无法执行form.is_有效。可以吗

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

    我的测试是否相关


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

    您可以通过使用Django的默认设置来避免一些麻烦:

    url.py item_delete_form.html
    将是等效的。

    “不是真正的Django表单(即它没有链接到模型)”您知道
    表单。表单
    表单没有链接到模型?只有
    forms.ModelForm
    s是…谢谢您的评论。是的,我知道,我的第一次尝试是基于表单创建一个通用表单。表单。。。但最后我发现它有点无用,因为在我的状态中几乎什么都没有。从全局来看,它只是一个按钮(和带有id的隐藏字段)。@PaulZakharov我想问一下,为什么您有这个
    post\u item\u id=int(request.post[“pk]”)
    ?为什么在url中已经存在id时,您会发布该id,它看起来对我来说是多余的,并且看起来可以通过发布其id删除某个对象,而url引用的是其他对象。@abdul aziz barkat谢谢。事实上,这似乎没有必要。只是为了解释我为什么写它。可能有两个原因:1)起初我开始使用通用表单编码。表单中有一个“pk”。然后我发现表单是不必要的,所以我放弃了它,但“pk”保留了下来。2) 第二个原因:可能是在将来,我想添加一个可能性,删除几个项目,所以我们应该能够删除项目的基础上有“主键”。但是在我的实际实现中有效的“pk”是没有必要的。非常感谢。您的解决方案似乎非常适合我的用例,我可能会采用它。关于我的认识还有一个很小的问题(只是为了理解)。很明显,它不是最佳的解决方案,也不是干净的解决方案,但您是否看到了使它变得危险的陷阱。这里没有特别危险的东西(除了您没有所需的
    @login\u
    或任何其他身份验证)。只是你做了很多不该做的体力活。非常感谢。小更新。最后,我认为第二个选项(仅使用url.py)没有实现所有功能,因为它没有将cur_项传递给模板来显示它。我在这里做了:
    render(请求'myapp/item\u delete\u form.html',{'cur\u item':cur\u item})
    。不过,似乎使用views.py我可以很容易地做到这一点
    context\u object\u name='name\u-to\u-use\u-in\u-template'
    完美完成这项工作。
    <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>
    
    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)
    
    path('item/delete/<int:pk>/', DeleteItemView.as_view(), name='delete_item'),
    
    class DeleteItemView(DeleteView):
        model = Item
        template_name = "myapp/item_delete_form.html"
        success_url = reverse_lazy('items')
    
    <form method="post">
       {% csrf_token %}
       <input class="btn btn-default btn-danger" name="delete" type="submit" value="yes" />
    </form>
    
    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",
    )