django.contrib.comments.views.moderation モジュールの delete() 関数を使用しています。スタッフはコメント投稿を削除できますが、これはまったく問題ありません。ただし、登録された非スタッフメンバーにも、自分の OWN コメント投稿を削除する権限と、自分の OWN のみを削除する権限を与えたいと思います。どうすればこれを達成できますか?
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()
私はちょうどこの問題に遭遇しました。
コメント アプリの削除ビューのロジックを再実装するだけで、実装がその特定のバージョンのコメント アプリに結合されます。たとえば、実際のコメント アプリは、何かを削除済みとしてマークするとシグナルも処理しますが、提供されたバージョンはそれを行いません。
幸いなことに、コメント アプリには、アクセス許可なしでコアの削除ロジックを実装する関数が用意されています。それを使用すると、内部の詳細に自分自身が結び付けられますが、それは非常に具体的な方法で行われ、壊れるか機能するかのいずれかであり、半分は機能しません. 独自のセキュリティ モデルで独自のビューを作成し、提供されたコメント アプリ関数を呼び出すことができます (django.contrib.comments.views.moderation import perform_delete から)。
コードは次のようになります。
@ログインが必要です def delete_my_comment (request, comment_id, next=None): コメント = get_object_or_404(comments.get_model(), pk=comment_id) comment.user == request.user の場合: request.method == "POST" の場合: perform_delete(リクエスト、コメント) return redirect("your_view", comment.content_object.id) そうしないと: return render_to_response('comments/delete.html', {'comment': コメント, "next": 次}, RequestContext(リクエスト)) そうしないと: Http404を上げる
詳細は、ユースケースによって異なります。
私はいくつかのバリエーションを試しました (このコメントの履歴で確認できます)。これは、ここで提供されている元のソリューションよりもあらゆる点で優れていると思います。
これは少し遅れていますが、テンプレートで同じことを同様に行うことはできませんか?
{% if user == comment.user %}
<a href="{% url comments-delete comment.id %}">delete comment</a>
{% endif %}
これは、django のコメント URL を使用します。
url(r'^delete/(\d+)/$', 'moderation.delete', name='comments-delete'),
HTML で ,を使用しif request.method == 'POST':
ているため、次のようなフォームを介して送信する必要があります。
<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 を使用)