2010-02-22 23 views
6

Używam funkcji delete() z modułu django.contrib.comments.views.moderation. Członek personelu może usunąć WSZELKIE komentarze, co jest całkowicie w porządku. Chciałbym jednak również dać zarejestrowanym pracownikom niebędącym pracownikami przywilej do usuwania własnych komentarzy i ich własnych OWN. Jak mogę to zrobić?Umożliwianie użytkownikom usuwania własnych komentarzy w Django

Odpowiedz

4

Jeśli chcesz oznaczyć komentarz jako usunięte, tak jak robi 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() 
+0

Lubię korzystać z Http404 w tym przypadku, ponieważ ujawnia on niewiele informacji o systemie, jeśli ktoś muckuje za pomocą adresów URL. 'if comment.user! = request.user: raise Http404' Możesz również użyć' get_object_or_404', aby pobrać komentarz, który ma więcej sensu niż błąd 500, jeśli w adresie URL zostanie wysłany zły identyfikator message_id. –

+0

Powyższy przykład prawie działa. Powinienem był powiedzieć, że chciałem, aby komentarze zostały zgłoszone do usunięcia, zamiast faktycznie usuwać komentarze. Aby to zrobić, wydaje mi się, że muszę wysłać żądanie POST. Jak wysłać żądanie POST w przeciwieństwie do GET? – RaDeuX

+0

Nie musisz wysyłać POST, możesz po prostu naśladować to, co robi widok 'comments'; patrz edycja. –

1

Chociaż jest to trochę późno, nie można zrobić to samo podobnie w szablonie?

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

używa Django komentarze URL:

url(r'^delete/(\d+)/$', 'moderation.delete',   name='comments-delete'), 
+0

Myślałem o tym też. Jednak ta funkcja usuwania wymaga, aby użytkownik miał uprawnienie do usuwania komentarzy. Jeśli dam każdemu normalnemu użytkownikowi zgodę na usunięcie jakiegokolwiek komentarza, będę miał poważny problem z bezpieczeństwem. – RaDeuX

3

po prostu wpadł na ten problem.

Po prostu ponowne wprowadzenie logiki w widoku usuwania aplikacji komentarzy spowoduje powiązanie implementacji z określoną wersją aplikacji komentarzy. Na przykład aplikacja komentarzy również obsługuje sygnały, gdy oznaczysz coś jako usunięte, a podana wersja tego nie robi.

Na szczęście aplikacja komentarzy zapewnia funkcję, która implementuje logikę core core bez żadnych uprawnień. Używanie go wiąże się z wewnętrznymi szczegółami, ale robi to w bardzo specyficzny sposób, który albo się załamie, albo zadziała, nigdy nie będzie działał w połowie. Możesz stworzyć swój własny pogląd z własnym modelu zabezpieczeń, a następnie zadzwonić podaną funkcję komentarz app (z django.contrib.comments.views.moderation importowej perform_delete)

kod będzie wyglądał mniej więcej tak:

 
@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 

Dane osobowe będą różne w zależności od przypadku użycia.

Przeszedłem kilka odmian (które można zobaczyć w historii tego komentarza) i myślę, że ten jest lepszy pod każdym względem niż oryginalne rozwiązanie oferowane tutaj.

+0

Uzgodnione. Używanie 'perform_delete' jest lepszym rozwiązaniem, ponieważ: 1) odłączyć rzeczywistą logikę usuwania komentarzy. 2) perform_delete tak naprawdę nie usuwa, ale zaznacza komentarz jako usunięty. 3) perform_delete uruchamia sygnał comment_was_flagged, którego używam do aktualizacji naszego indeksu wyszukiwania – mynameistechno

Powiązane problemy