2010-02-22 13 views
6

Sto usando la funzione delete() dal modulo django.contrib.comments.views.moderation. Il membro dello staff è autorizzato a cancellare QUALSIASI post di commento, che è completamente a posto. Tuttavia, vorrei anche dare ai membri registrati non membri del personale il privilegio di cancellare i propri post di commenti PROPRI e solo di PROPRIETÀ. Come posso realizzare questo?Permettere agli utenti di cancellare i propri commenti in Django

risposta

4

Se si desidera contrassegnare il commento come cancellato, proprio come fa 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

Mi piace utilizzare Http404 in questo caso in quanto rivela poco sul sistema se qualcuno sta trafficando con gli URL. 'if comment.user! = request.user: raise Http404' Puoi anche usare' get_object_or_404' per recuperare il commento che ha più senso di un errore 500 se un messaggio errato viene inviato nell'URL. –

+0

L'esempio sopra riportato funziona quasi. Avrei dovuto dire che volevo che i commenti venissero contrassegnati per la cancellazione invece di eliminare effettivamente i commenti. Per fare ciò, sembra che ho bisogno di inviare una richiesta POST. Come invio una richiesta POST rispetto a una GET? – RaDeuX

+0

Non è necessario inviare un POST, si può semplicemente imitare ciò che fa la vista 'commenti'; vedi modifica. –

1

Mentre questo è un po 'in ritardo, non si può fare la stessa cosa in modo simile nel modello?

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

Questo utilizza i commenti URL di Django:

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

Ho pensato anche a questo. Tuttavia, tale funzione di eliminazione richiede che l'utente abbia il permesso di eliminare il commento. Se do ad ogni utente normale il permesso di cancellare qualsiasi commento, avrei un serio problema di sicurezza. – RaDeuX

3

Ho appena incontrato questo problema.

La semplice re-implementazione della logica nella visualizzazione dell'eliminazione dell'app commenti accorcerebbe l'implementazione a quella versione specifica dell'app commenti. Ad esempio, l'app di commento effettiva gestisce anche i segnali quando contrassegni qualcosa come cancellato e la versione fornita non lo fa.

Fortunatamente l'app commenti fornisce una funzione che implementa la logica di cancellazione principale senza alcuna autorizzazione. Usarlo si lega ai dettagli interni, ma lo fa in un modo molto specifico che può rompersi o funzionare, non funzionerà mai a metà. È possibile creare il proprio punto di vista con il proprio modello di sicurezza e quindi chiamare la funzione commento applicazione fornita (da django.contrib.comments.views.moderation import perform_delete)

Il codice dovrebbe essere simile a questa:

 
@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 

I dettagli possono variare in base al caso d'uso.

Ho avuto alcune variazioni (che puoi vedere nella cronologia di questo commento), e penso che questo sia migliore in tutti i modi rispetto alla soluzione originale offerta qui.

+0

concordato. L'utilizzo di "perform_delete" è una soluzione migliore perché: 1) disaccoppia la logica di eliminazione dei commenti effettivi. 2) perform_delete in realtà non elimina, ma contrassegna il commento come rimosso. 3) perform_delete attiva il segnale comment_was_flagged, che uso per aggiornare il nostro indice di ricerca – mynameistechno

Problemi correlati