Разрешение пользователям удалять свои комментарии в Django - PullRequest
7 голосов
/ 23 февраля 2010

Я использую функцию delete () из модуля django.contrib.comments.views.moderation. Сотруднику разрешено удалять ЛЮБЫЕ комментарии, что вполне нормально. Однако я также хотел бы предоставить зарегистрированным лицам, не являющимся сотрудниками, право удалять только свои СОБСТВЕННЫЕ комментарии и только свои СОБСТВЕННЫЕ. Как мне это сделать?

Ответы [ 4 ]

5 голосов
/ 23 февраля 2010

Если вы хотите пометить комментарий как удаленный, то же самое делает 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()
3 голосов
/ 17 июля 2010

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

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

К счастью, приложение комментариев предоставляет функцию, которая реализует логику удаления ядра без каких-либо разрешений. Его использование связывает вас с внутренними деталями, но делает это очень специфическим образом, который либо сломается, либо сработает, он никогда не будет работать наполовину. Вы можете создать свой собственный вид с его собственной моделью безопасности, а затем вызвать предоставленную функцию приложения комментария (из django.contrib.comments.views.moderation import execute_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

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

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

1 голос
/ 20 марта 2010

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

{% if user == comment.user %}
  <a href="{% url comments-delete comment.id %}">delete comment</a> 
{% endif %}

Используется URL комментариев django:

url(r'^delete/(\d+)/$',  'moderation.delete',           name='comments-delete'),
0 голосов
/ 11 июля 2018

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

...