2010-02-22 5 views
6

J'utilise la fonction delete() du module django.contrib.comments.views.moderation. Le membre du personnel est autorisé à supprimer tous les commentaires, ce qui est tout à fait correct. Cependant, je voudrais également donner aux non-membres enregistrés le privilège de supprimer leurs propres commentaires, et leur PROPRE seulement. Comment puis-je accomplir cela?Autoriser les utilisateurs à supprimer leurs propres commentaires dans Django

Répondre

4

Si vous voulez marquer le commentaire comme supprimé, tout comme django.contrib.comments.views.moderation.delete() fait:

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

J'aime utiliser Http404 dans ce cas, car il révèle peu sur votre système si quelqu'un est en train de déblayer avec des URL. 'si comment.user! = request.user: raise Http404' Vous pouvez aussi utiliser' get_object_or_404' pour récupérer le commentaire qui a plus de sens qu'une erreur 500 si un mauvais message_id est envoyé dans l'URL. –

+0

L'exemple mentionné ci-dessus fonctionne presque. J'aurais dû dire que je voulais que les commentaires soient supprimés au lieu de supprimer les commentaires. Pour ce faire, il semble que je doive envoyer une requête POST. Comment envoyer une demande POST par opposition à une requête GET? – RaDeuX

+0

Vous n'avez pas besoin d'envoyer un POST, vous pouvez simplement imiter ce que fait la vue 'comments'; voir modifier. –

1

Bien que ce soit un peu en retard ne pouvez pas vous faire la même chose de la même dans le modèle?

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

Il utilise l'URL des commentaires de django:

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

J'ai aussi pensé à ça. Cependant, cette fonction de suppression nécessite que l'utilisateur dispose de l'autorisation de suppression de commentaire. Si je donne à chaque utilisateur normal la permission de supprimer n'importe quel commentaire, j'aurais un sérieux problème de sécurité. – RaDeuX

3

Je viens de rencontrer ce problème. Il suffit de ré-implémenter la logique dans la vue de suppression de l'application de commentaires pour coupler votre implémentation à cette version spécifique de l'application de commentaires. Par exemple, l'application de commentaire réelle gère également les signaux lorsque vous marquez quelque chose comme supprimé et la version fournie ne le fait pas.

Heureusement, l'application de commentaires fournit une fonction qui implémente la logique de suppression de base sans aucune autorisation. L'utiliser vous relie aux détails internes, mais il le fait d'une manière très spécifique qui va soit se casser ou travailler, il ne fonctionnera jamais à moitié. Vous pouvez créer votre propre point de vue avec son propre modèle de sécurité, puis appeler la fonction fournie app commentaire (à partir perform_delete import django.contrib.comments.views.moderation)

Le code ressemblerait à quelque chose comme ceci:

 
@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 

Vous les détails varient en fonction de votre cas d'utilisation.

J'ai parcouru quelques variations (que vous pouvez voir dans l'historique de ce commentaire), et je pense que celui-ci est meilleur à tous égards que la solution originale proposée ici.

+0

D'accord. Utiliser 'perform_delete' est une meilleure solution car: 1) découpler la logique de suppression des commentaires. 2) perform_delete ne supprime pas réellement, mais marque le commentaire comme étant supprimé. 3) perform_delete déclenche le signal comment_was_flagged, que j'utilise pour mettre à jour notre index de recherche – mynameistechno

Questions connexes