我今天花了好几个小时研究如何在Django中删除对象。我已经在网上找到并尝试了4种不同的方法,只有在使用表单/POST/GET方法时才有所区别。对于我来说,CSRF攻击是无关紧要的,因为页面应该在本地运行。
这个应用程序做什么?目前只能在特定项目名称下上传文件。这个名称被slugify并用作将项目文件哈希在一起的键。现在我也想删除文件(以后是整个项目)。
以下是其中一种方法:
在
这个应用程序做什么?目前只能在特定项目名称下上传文件。这个名称被slugify并用作将项目文件哈希在一起的键。现在我也想删除文件(以后是整个项目)。
以下是其中一种方法:
在
.html
中:<a href="{{file.pk}}/delete" class="btn btn-sm" role="button" title="Delete File">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
</a>
这个链接显示在详细视图中,所以URL看起来像/files/SLUG/。
然后在urls.py
中:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^upload/$', views.file_upload, name ='upload'),
url(r'^upload/(?P<slug>[\w-]+)/$', views.file_upload, name ='upload'),
url(r'^(?P<slug>[\w-]+)/$', views.file_detail, name='detail'),
url(r'^(?P<slug>[\w-]+)/(?P<pk>\d+)/delete$', views.file_delete, name="file_delete"),
]
最后是 views.py
文件:
def file_delete(request, slug=None, pk=None):
instance = get_object_or_404(File, slug=slug, pk=pk)
# instance = File.objects.filter(pk=pk, slug=slug)[0] # the same as above
instance.delete() #does not work
return redirect("index") # or anything, this part is no problem
所有操作都没有出现错误,但是当我在/admin上检查数据库时,没有文件被删除。它只是没有被删除。有时,在尝试几次登录/admin后,我会在登录屏幕上看到多个“文件已成功删除”的消息。但是这些文件仍然在数据库列表中。
Django文档告诉我delete()应该返回某种字典以及删除了多少个对象,例如:
>>> e.delete()
(1, {'weblog.Entry': 1})
但在我的情况下,它只是显示“无”或返回以标识符开头的路径。
如果有任何提示,我将非常感激。我知道stackoverflow上至少有另一篇帖子涉及此问题,但不幸的是没有答案。