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