python - Django删除项目用例:好的做法?
问题描述
小笼统的解释。
我是 Django 的新手,我有一点知识,但没有经验。我想问的代码正在运行,但我有一个关于好/坏做法的问题。我的方法是好的还是至少不错?
小用例说明。
我有一个包含这些项目的网站。有添加项目的功能,现在我想添加删除项目的可能性。
用例:在项目页面上,用户单击删除按钮,我们将显示一个页面,其中包含有关该项目的详细信息以及底部的“确认删除”按钮。如果用户单击按钮,我会从数据库中删除该项目。
所以
- 我在urls.py中创建
path('item/delete/<int:id>/', views.delete_item, {}, 'delete_item'),
- 我在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})
- 我不使用 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>
- 最后在这里进行小测试来检查它:
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。可以吗?
是否有一些我应该考虑的陷阱(例如,用户是否有权删除此项目,但目前用户系统尚未开发,因此我对此无能为力)?
我的测试是否相关?
最后,如果我的实现不是一个好的或可接受的实践,我应该如何做我的用例?
解决方案
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",
)
将是等效的。
推荐阅读
- python - 逐行读取大型json(> 5gb)文件并处理每一行并使用Pandas创建DataFrame
- drupal - 如何使用现有数据库安装 Drupal 8?
- jenkins - 如何对某些分支执行 git checkout,然后使用 Jenkins 为私有存储库执行 git pull?
- python - 在 geom_density 中使用分类列时出错
- sql - Postgres 索引统计信息 - 上次使用日期
- excel - 声明包含后期绑定字典对象的自定义数据类型
- django - 用于座位预订的 Django 模型
- php - 无法实例化接口 phpDocumentor\Reflection\Project
- c# - 如何判断app是否存在?(Process.Start 可以找到它们)
- pyspark - Pyspark 中的 GroupBy 操作