Я использую функцию delete() из модуля django.contrib.com.com.views.moderation. Сотруднику разрешено удалять ЛЮБЫЕ комментарии, что совершенно нормально. Тем не менее, я также хотел бы предоставить зарегистрированным сотрудникам, не являющимся сотрудниками, привилегию удалить свои комментарии в СОБСТВЕННЫХ комментариях и только их СОБСТВЕННОСТЬ. Как я могу это сделать?Позволяет пользователям удалять свои собственные комментарии в 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 %}
Это использует комментарии Джанго URL:
url(r'^delete/(\d+)/$', 'moderation.delete', name='comments-delete'),
Я тоже думал об этом. Однако эта функция удаления требует, чтобы пользователь имел разрешение на удаление. Если я дам каждому нормальному пользователю разрешение на удаление комментариев, у меня возникнет серьезная проблема с безопасностью. – RaDeuX
Я просто столкнулся с этой проблемой.
Просто повторная реализация логики в представлении об удалении приложения комментариев свяжет вашу реализацию с этой конкретной версией приложения комментариев. Например, приложение comment actual также обрабатывает сигналы, когда вы отмечаете что-то как удаленное, а предоставленная версия этого не делает.
К счастью, приложение комментариев предоставляет функцию, которая реализует логику удаления ядра без каких-либо разрешений. Используя его, привязывайте себя к внутренним деталям, но он делает это очень определенным образом, который либо сломается, либо будет работать, он никогда не будет работать наполовину. Вы можете создать свой собственный взгляд со своей моделью безопасности, а затем вызвать функцию при условии комментария приложения (от 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) execute_delete фактически не удаляется, но помещает комментарий как удаленный. 3) execute_delete запускает сигнал comment_was_flagged, который я использую для обновления нашего поискового индекса – mynameistechno
Мне нравится использовать Http404 в этом случае, так как он мало что знает о вашей системе, если кто-то дергает URL-адреса. 'if comment.user! = request.user: raise Http404' Вы также можете использовать' get_object_or_404' для получения комментария, который имеет больше смысла, чем ошибка 500, если в URL-адресе отправляется сообщение bad__id_id. –
Вышеупомянутый пример почти работает. Я должен был сказать, что хочу, чтобы комментарии были помечены для удаления вместо фактического удаления комментариев. Для этого мне кажется, что мне нужно отправить запрос POST. Как отправить запрос POST, а не GET? – RaDeuX
Вам не нужно отправлять POST, вы можете просто имитировать то, что делает просмотр 'comments'; см. править. –