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