2010-02-22 79 views
6

我正在使用django.contrib.comments.views.moderation模塊中的delete()函數。工作人員可以刪除任何評論帖子,這是完全正確的。但是,我還想給註冊非職員成員刪除他們自己的評論帖子和他們自己的專有權。我怎樣才能做到這一點?允許用戶在Django中刪除自己的註釋

回答

4

如果你想標記註釋爲已刪除,就像django.contrib.comments.views.moderation.delete()做:

from django.contrib.auth.decorators import login_required 
from django.contrib.comments.models import Comment 
from django.shortcuts import get_object_or_404 
from django.conf import settings 
from django.contrib import comments 

@login_required 
def delete_own_comment(request, message_id): 
    comment = get_object_or_404(comments.get_model(), pk=message_id, 
      site__pk=settings.SITE_ID) 
    if comment.user == request.user: 
     comment.is_removed = True 
     comment.save() 
+0

在這種情況下,我喜歡使用Http404,因爲如果有人在使用URL,它會對您的系統進行很少的揭示。 'if comment.user!= request.user:raise Http404' 如果在URL中發送錯誤的message_id,您還可以使用'get_object_or_404'來檢索比500錯誤更有意義的註釋。 – 2010-02-23 00:32:34

+0

上面提到的例子幾乎可行。我應該說我希望評論被標記爲刪除而不是實際刪除評論。要做到這一點,似乎我需要發送POST請求。我如何發送POST請求而不是GET? – RaDeuX 2010-02-23 01:57:26

+0

你不需要發送POST,你可以模仿'comments'視圖的作用;請參閱編輯。 – 2010-02-23 04:24:05

1

雖然這是一個有點晚你不能在模板中做同樣的事情類似?

{% if user == comment.user %} 
    <a href="{% url comments-delete comment.id %}">delete comment</a> 
{% endif %} 

這將使用Django的意見網址:

url(r'^delete/(\d+)/$', 'moderation.delete',   name='comments-delete'), 
+0

我也想過這個。但是,該刪除功能要求用戶具有刪除評論權限。如果我給每個普通用戶刪除任何評論的權限,我會遇到嚴重的安全問題。 – RaDeuX 2010-03-21 04:39:08

3

我只是碰到了這個問題。

只需在評論應用的刪除視圖中重新實現邏輯,就可以將您的實現與特定版本的評論應用相結合。例如,評論應用程序實際還處理信號時,你標記爲刪除和提供的版本不這樣做。

幸運的是,評論應用程序提供了一個功能,實現核心刪除邏輯沒有任何權限。使用它將你自己與內部細節聯繫起來,但它是以非常特定的方式來實現的,不管是打破還是工作,它都不會工作。你可以有自己的安全模型創建自己的觀點,然後調用提供評論功能的應用程序(從django.contrib.comments.views.moderation進口perform_delete)

的代碼會是這個樣子:

 
@login_required 
def delete_my_comment(request, comment_id, next=None): 
    comment = get_object_or_404(comments.get_model(), pk=comment_id) 
    if comment.user == request.user: 
     if request.method == "POST": 
      perform_delete(request, comment) 
      return redirect("your_view", comment.content_object.id) 
     else: 
      return render_to_response('comments/delete.html', 
             {'comment': comment, "next": next}, 
             RequestContext(request)) 
    else: 
     raise Http404 

您的詳細信息將根據您的使用情況而有所不同。

我已經經歷了一些變化(你可以在這個評論的歷史中看到),我認爲這個在所有方面比在這裏提供的原始解決方案更好。

+0

同意。使用'perform_delete'是一個更好的解決方案,因爲:1)解耦實際註釋刪除邏輯。 2)perform_delete實際上並未刪除,但將註釋標記爲已刪除。 3)perform_delete觸發comment_was_flagged信號,我用它來更新我們的搜索索引 – mynameistechno 2013-04-17 16:25:59