Django删除项用例:好的实践

  • 本文关键字:删除 Django python django
  • 更新时间 :
  • 英文 :


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

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

所以

  1. 我在urls.py中创建

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

  1. 我在视图中创建。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 Forms,因为对我来说,它不是真正的Django表单(即,它没有链接到模型(。正如@akx在评论中提到的那样,我总是可以直接基于表单创建表单。表单。但这对我来说似乎也没用,因为事实上我的表单中几乎没有数据。
    相反,我只是在模板中创建通用表单。在templates/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)

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

做实践分析请求。POST列表不是"POST"列表;不良做法"?由于我不使用Django表单,所以我无法使用form.is_valid。可以吗?

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

我的测试是否相关?

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

只需使用Django的默认DeleteViewCBV:,就可以省去不少麻烦

urls.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。只需在urls.py中设置CBV的参数即可…

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",
)

将是等效的。

最新更新