允许用户在Django中删除自己的注释

时间:2010-02-22 23:51:31

标签: python django django-comments

我正在使用django.contrib.comments.views.moderation模块中的delete()函数。工作人员可以删除任何评论帖,这完全没问题。但是,我还想让已登记的非工作人员有权删除他们的OWN评论帖子和他们自己的OWN。我怎么能做到这一点?

4 个答案:

答案 0 :(得分:5)

如果您想将评论标记为已删除,就像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()

答案 1 :(得分:3)

我刚遇到这个问题。

只需在评论应用程序的删除视图中重新实现逻辑,就可以将您的实现与特定版本的评论应用程序结合起来。例如,当您将某些内容标记为已删除且所提供的版本不执行此操作时,注释应用实际也会处理信号。

幸运的是,评论应用程序提供了一个实现核心删除逻辑而没有任何权限的功能。使用它可以将自己与内部细节联系起来,但它会以一种非常具体的方式实现,无论是破坏还是工作,它都不会起作用。您可以使用自己的安全模型创建自己的视图,然后调用提供的评论应用程序功能(来自django.contrib.comments.views.moderation import 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

您的详细信息将根据您的使用情况而有所不同。

我已经完成了一些变化(你可以在这篇评论的历史中看到),我认为这个变体在各方面都比这里提供的原始解决方案更好。

答案 2 :(得分: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'),

答案 3 :(得分:0)

由于您使用的是if request.method == 'POST':,因此在HTML中,您需要通过以下形式将其发送:

<form action = "{% url 'comments-delete' %}" method = "POST">
    {% csrf_token %}
    <input type="hidden" name="comment_id" value="{{ comment.id }}"/>
    <input type="hidden" name="blogs_id" value="{{ blogs.id }}"/>
    <button>Delete</button>
</form>

views.py

def delete_comment(request):
id = request.POST['comment_id']
pk = request.POST['blogs_id']
if request.method == 'POST':
    comment = get_object_or_404(Comment, id=id, pk=pk)
    try:
        comment.delete()
        messages.success(request, 'You have successfully deleted the comment')

    except:
        messages.warning(request, 'The comment could not be deleted.')

return redirect('get_posts')

urls.py

path('delete/comment/', delete_comment, name='delete_comment'),

(使用Django 2)