我有一个模板,显示用户上传的文件。我设法制作了一个允许我删除用户上传的所有文件的视图,但我也希望能够单独删除每个文件。
我有一张自举卡,在正文中我用右边的删除链接显示每个文件:
<div class="card-body text-light">
{% for doc in docs %}
<ul>
<a href="/media/{{doc}}" download style="color:lightblue"><font face="Ubuntu">{{doc.document|filename}}</font></a>
<a href="#"><font face="Ubuntu" color="red">Delete</font></a>
</ul>
{%endfor%}
</div>
&#13;
在卡片页脚中,我使用删除所有文件的视图:
<div class="card-footer bg-transparent border-light">
<a href="{% url 'main:delete' %}"><i class="fas fa-trash-alt" style="color:red"></i> <font face="Ubuntu" color="red"><b>Delete All Files</b></font></a>
</div>
&#13;
我的删除视图如下:
def delete(request, **kwargs):
documents = Document.objects.filter(owner=request.user.id)
documents.delete()
cleanup_post_delete.connect(delete, request)
return redirect('main:user_panel')
问题是,我无法想象如何单独删除每个文件,想到使用了objects.get()方法,但它确实无法帮助我。我需要一些针对特定文件的视图并将其删除。
更新:
所以,这就是我解决问题的方法:
我创建了另一个名为delete_single的视图:
def delete_single(request, id):
document = Document.objects.get(pk=id)
document.delete(id)
return redirect('main:user_panel')
但这还不够,所以通过搜索我找到了解决方法,这两个类在安全方面会有所帮助,因为我发现否则我的文件对象可能容易受到CSRF攻击(不是这对我来说现在很重要,因为这只是我的一个项目,我不打算用它做任何特别的事情,但我还是把它作为好的做法):
class PermissionMixin(object):
def get_object(self, *args, **kwargs):
obj = super(PermissionMixin, self).get_object(*args, **kwargs)
if not obj.owner == self.request.user:
raise PermissionDenied()
else:
return obj
class PostDelete(PermissionMixin, DeleteView):
model = Document
success_url = reverse_lazy('main:user_panel')
同样在urls.py中:
url(r'^delete_single/(?P<pk>\d+)/$', views.PostDelete.as_view(), name='delete_single')
最后在我的模板中:
<form action="{% url 'main:delete_single' doc.pk %}" method="post">
{% csrf_token %}
<input class="btn btn-danger" type="submit" value="Delete" />
</form>
&#13;