2010-02-22 47 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

相关问题