2014-10-02 59 views
6

我有一個Post模型的項目,那就是基本帖子。我想在每個帖子頁面上創建一個鏈接,以便能夠刪除該帖子(具有適當的安全性)。通過html鏈接刪除Django中的對象

關於堆棧溢出,有幾個問題,但我似乎無法找到一個完整的,可行的答案(我使用Django 1.7),當我執行它時不會拋出錯誤。

我已經能夠實現可以正常工作的刪除功能,但需要添加一個帶CSRF標記的POST表單進行驗證,並且還要檢查刪除它的用戶是否是創建它的用戶。我似乎無法弄清楚如何在添加這兩個

到目前爲止,在我的views.py:

def delete(request, id): 
    post = Post.objects.filter(pk=id).delete() 
    return HttpResponseRedirect(reverse('posts.views.all_posts')) 

在urls.py:

url(r'^delete/(?P<id>\d+)/$','posts.views.delete'), 

在HTML:

<a href="/delete/{{ post.id }}">Delete</a> 

這一切都有效,但沒有安全保障 - 因此,如何添加表單並檢查指導意見。

此外,我看到一個使用DeleteView的答案,但無法讓它工作。

+0

我只是想澄清,如果用戶需要登錄才能查看所有帖子? – catherine 2014-10-02 06:19:43

回答

8

確實,使用GET方法刪除您的對象會讓您容易受到CSRF attacks的影響。

DeleteView只在POST上刪除,並在GET上顯示確認頁面。

你的代碼應該是這個樣子的views.py

from django.views.generic import DeleteView 

class PostDelete(DeleteView): 
    model = Post 
    success_url = reverse_lazy('posts.views.all_posts') 

urls.py

url(r'^delete/(?P<pk>\d+)/$', PostDelete.as_view(), 
     name='entry_delete'), 

您的形式(不使用確認模板有一個在文檔確認模板的一個例子。 ):

<form action="{% url 'entry_delete' object.pk %}" method="post"> 
    {% csrf_token %} 
    <input type="submit" value="Delete" /> 
</form> 

如果你是t使用確認模板時,請確保將表單的action屬性指向​​(this is why)。

爲確保用戶刪除帖子是擁有它的用戶,我喜歡使用mixins。假設你Post模型具有created_by外鍵指向User,你可以寫這樣一個mixin:

from django.core.exceptions import PermissionDenied 

class PermissionMixin(object): 

    def get_object(self, *args, **kwargs): 
     obj = super(PermissionMixin, self).get_object(*args, **kwargs) 
     if not obj.created_by == self.request.user: 
      raise PermissionDenied() 
     else: 
      return obj 

最後,您​​應該從這個混入繼承:

class PostDelete(PermissionMixin, DeleteView): 

    model = Post 
    success_url = reverse_lazy('posts.views.all_posts') 
+0

輝煌的,完美的工作 - 我嘗試沒有確認屏幕,它工作得很好。我現在嘗試添加確認屏幕。 – 2014-10-02 06:48:59

+0

對於任何未來的人來說,你還需要在你的urls.py中導入PostDelete,例如:from views import PostDelete – 2014-10-02 06:50:18