我正在使用django.contrib.comments.views.moderation模块中的delete()函数。工作人员可以删除任何评论帖子,这是完全正确的。但是,我还想给注册非职员成员删除他们自己的评论帖子和他们自己的专有权。我怎样才能做到这一点?允许用户在Django中删除自己的注释
回答
如果你想标记注释为已删除,就像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()
虽然这是一个有点晚你不能在模板中做同样的事情类似?
{% 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'),
我也想过这个。但是,该删除功能要求用户具有删除评论权限。如果我给每个普通用户删除任何评论的权限,我会遇到严重的安全问题。 – RaDeuX 2010-03-21 04:39:08
我只是碰到了这个问题。
只需在评论应用的删除视图中重新实现逻辑,就可以将您的实现与特定版本的评论应用相结合。例如,评论应用程序实际还处理信号时,你标记为删除和提供的版本不这样做。
幸运的是,评论应用程序提供了一个功能,实现核心删除逻辑没有任何权限。使用它将你自己与内部细节联系起来,但它是以非常特定的方式来实现的,不管是打破还是工作,它都不会工作。你可以有自己的安全模型创建自己的观点,然后调用提供评论功能的应用程序(从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
您的详细信息将根据您的使用情况而有所不同。
我已经经历了一些变化(你可以在这个评论的历史中看到),我认为这个在所有方面比在这里提供的原始解决方案更好。
同意。使用'perform_delete'是一个更好的解决方案,因为:1)解耦实际注释删除逻辑。 2)perform_delete实际上并未删除,但将注释标记为已删除。 3)perform_delete触发comment_was_flagged信号,我用它来更新我们的搜索索引 – mynameistechno 2013-04-17 16:25:59
- 1. 允许用户删除自己的帐户 - Authlogic
- 2. Django注册:如何允许用户删除他们的帐户?
- 3. 允许用户在导轨中删除他们自己的评论3
- 4. CanCan - 如何允许用户更新和删除他们自己的对象
- 5. 允许用户在PHP中添加自己的水印
- 6. 在django注册中自动删除用户名空间
- 7. datagridview不允许用户删除行
- 8. 访问不允许用户删除行
- 9. DataGridView不允许用户删除行
- 10. 这里不允许注释
- 11. Symfony2 - 允许用户使用自己的Google帐户登录
- 12. 在JSP中注销用户后清除缓存不允许scriptlet
- 13. 删除Intellij中的注释
- 14. 使用C#,允许用户编写自己的方法
- 15. 允许类“自我注册”,将自己添加到列表等
- 16. 允许用户创建自己的字段的最佳方法
- 17. Apple允许使用除自己以外的广告API吗?
- 18. Drupal Commerce允许用户取消自己的订单
- 19. Android是否允许用户提供自己的字体?
- 20. 允许用户实现他们自己的方法。可能吗?
- 21. 允许用户创建自己的页面
- 22. mvc razor允许用户选择自己的主题css
- 23. rails允许非用户编辑自己的配置文件
- 24. 允许用户为表单背景选择自己的颜色
- 25. 允许用户创建自己的工作流程场景
- 26. MVC5:允许用户只查看和编辑自己的信息
- 27. 允许用户设置自己的菜单快捷键
- 28. 允许用户只更改自己的密码/详细信息
- 29. 只允许用户编辑自己的内容
- 30. 允许用户更改自己的信息
在这种情况下,我喜欢使用Http404,因为如果有人在使用URL,它会对您的系统进行很少的揭示。 'if comment.user!= request.user:raise Http404' 如果在URL中发送错误的message_id,您还可以使用'get_object_or_404'来检索比500错误更有意义的注释。 – 2010-02-23 00:32:34
上面提到的例子几乎可行。我应该说我希望评论被标记为删除而不是实际删除评论。要做到这一点,似乎我需要发送POST请求。我如何发送POST请求而不是GET? – RaDeuX 2010-02-23 01:57:26
你不需要发送POST,你可以模仿'comments'视图的作用;请参阅编辑。 – 2010-02-23 04:24:05