Разрешение пользователям удалять собственные комментарии в Django

Я использую функцию 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()

Я просто столкнулся с этой проблемой.

просто повторная реализация логики в представлении удаления приложения комментариев свяжет вашу реализацию с этой конкретной версией приложения комментариев. Например, приложение comment actual также обрабатывает сигналы, когда вы отмечаете что-то как удаленное, а предоставленная версия этого не делает.

к счастью, приложение комментариев предоставляет функцию, которая реализует логику удаления ядра без каких-либо разрешений. Используя его связывает себя внутренние детали, но он делает это очень специфическим образом, который либо сломается, либо сработает, он никогда не будет работать наполовину. Вы можете создать свой собственный вид с собственной моделью безопасности, а затем вызвать предоставленную функцию приложения комментариев (из django.ВНО.комментарии.просмотр.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

вы детали поменяете основание на вашем случае использования.

Я прошел через несколько изменений (которые вы можете увидеть в история этого комментария), и я думаю, что это лучше во всех отношениях, чем оригинальное решение предложено здесь.


хотя это немного поздно, вы не можете сделать то же самое аналогично в шаблоне?

{% 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'),

так как вы используете 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)