Django对象删除无效。

3
我今天花了好几个小时研究如何在Django中删除对象。我已经在网上找到并尝试了4种不同的方法,只有在使用表单/POST/GET方法时才有所区别。对于我来说,CSRF攻击是无关紧要的,因为页面应该在本地运行。
这个应用程序做什么?目前只能在特定项目名称下上传文件。这个名称被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上至少有另一篇帖子涉及此问题,但不幸的是没有答案。


这个链接有用吗? - EbraHim
为什么您的a标签没有文件slug? - durdenk
@durdenk:有多个文件共享一个Slug。它像一个项目名称,一个项目可以包含多个文件。在这里,我只想删除某个文件,而不是整个项目。这就是为什么我使用.pk而不是Slug的原因。 - mathiasw24
@EbraHim:谢谢。我也尝试过这种方法,但并不完全理解它,并且没有足够的声望在评论中提出问题... 使用这种方法,HTML调用会是什么样子?我的意思是用于删除的<a href>或其他内容? - mathiasw24
2个回答

3

查询集删除方法(例如:File.objects.filter(...).delete())会返回一个元组。

如果你要删除一个实例对象(例如:instance.delete()),它会返回None

我不确定你所说的“查看文件列表时,没有文件被删除”的意思。请注意,当你删除一个模型实例时,它将从数据库中删除该行。如果该模型有一个FileField,它不会自动删除相关的文件。


3
我曾遇到类似的问题(那就是我发现这篇文章的原因),我认为如果你在删除的URL最后加上一个'/',它应该会起作用。至少对我来说是这样的。
...
    url(r'^(?P<slug>[\w-]+)/(?P<pk>\d+)/delete/<<<<$', views.file_delete, name="file_delete"),
    ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接