如何在Django中删除单个文件?

时间:2018-03-23 12:38:46

标签: django file

我有一个模板,显示用户上传的文件。我设法制作了一个允许我删除用户上传的所有文件的视图,但我也希望能够单独删除每个文件。

我有一张自举卡,在正文中我用右边的删除链接显示每个文件:



<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>&nbsp;
                {%endfor%}
            </div>
&#13;
&#13;
&#13;

在卡片页脚中,我使用删除所有文件的视图:

&#13;
&#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;
&#13;
&#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')

最后在我的模板中:

&#13;
&#13;
<form action="{% url 'main:delete_single' doc.pk %}" method="post">
                        {% csrf_token %}
                        <input class="btn btn-danger" type="submit" value="Delete" />
                    </form>
&#13;
&#13;
&#13;

0 个答案:

没有答案