2010-02-22 11 views
6

Ich benutze die Funktion delete() aus dem Modul django.contrib.comments.views.moderation. Der Mitarbeiter darf alle Kommentarbeiträge löschen, was völlig in Ordnung ist. Ich möchte registrierten Nicht-Mitarbeitern jedoch auch das Privileg geben, ihre eigenen Kommentar-Posts und nur ihre EIGENEN zu löschen. Wie kann ich das erreichen?Benutzern erlauben, ihre eigenen Kommentare in Django zu löschen

Antwort

4

Wenn Sie den Kommentar markieren, wie gelöscht, so wie django.contrib.comments.views.moderation.delete() tut:

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

Ich benutze Http404 in diesem Fall, da es wenig über Ihr System verrät, wenn jemand mit URLs muckt. 'if comment.user! = request.user: raise Http404' Sie können auch' get_object_or_404' verwenden, um den Kommentar abzurufen, der sinnvoller ist als ein 500er Fehler, wenn eine falsche message_id in der URL gesendet wird. –

+0

Das oben erwähnte Beispiel funktioniert fast. Ich hätte sagen sollen, dass die Kommentare zum Löschen markiert werden sollen, anstatt die Kommentare tatsächlich zu löschen. Um dies zu tun, scheint es, als müsste ich eine POST-Anfrage senden. Wie sende ich eine POST-Anfrage im Gegensatz zu einem GET? – RaDeuX

+0

Sie müssen keinen POST senden, Sie können nur nachahmen, was die Ansicht 'comments' bewirkt; siehe Bearbeiten. –

1

Während dies ein wenig zu spät ist, können nicht Sie die gleiche Sache ähnlich in der Vorlage zu tun?

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

Dies nutzt Djangos Kommentare URL:

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

Ich dachte auch darüber nach. Diese Löschfunktion erfordert jedoch, dass der Benutzer die Berechtigung zum Löschen von Kommentaren erhält. Wenn ich jedem normalen Benutzer die Erlaubnis gebe, einen Kommentar zu löschen, hätte ich ein ernsthaftes Sicherheitsproblem. – RaDeuX

3

ich nur in dieses Problem lief.

Wenn Sie die Logik in den Kommentaren einfach in die Delete-Ansicht der App implementieren, wird Ihre Implementierung mit dieser spezifischen Version der Kommentar-App verknüpft. Zum Beispiel handhabt die Kommentar-App auch Signale, wenn Sie etwas als gelöscht markieren und die gelieferte Version das nicht tut.

Glücklicherweise bietet die Kommentar-App eine Funktion, die die Kernlöschlogik ohne irgendwelche Berechtigungen implementiert. Wenn man es benutzt, bindet man sich an die inneren Details, aber es geschieht auf eine sehr spezifische Art und Weise, die entweder bricht oder funktioniert, es wird niemals halb funktionieren. Sie können Ihre eigene Ansicht mit einem eigenen Sicherheitsmodell erstellen und dann die bereitgestellte Kommentar App-Funktion aufrufen (von django.contrib.comments.views.moderation Import perform_delete)

Der Code wie folgt aussehen würde:

 
@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 

Ihre Angaben variieren je nach Anwendungsfall.

Ich habe ein paar Variationen durchgegangen (die Sie in der Geschichte dieses Kommentars sehen können), und ich denke, dass diese in jeder Hinsicht besser ist als die ursprüngliche Lösung, die hier angeboten wird.

+0

Einverstanden. Die Verwendung von 'perform_delete' ist eine bessere Lösung, weil: 1) die Logik zum Löschen von Kommentaren entkoppelt wird. 2) perform_delete löscht nicht wirklich, sondern markiert den Kommentar als entfernt. 3) perform_delete löst das comment_was_flagged Signal aus, mit dem ich unseren Suchindex aktualisiere – mynameistechno

Verwandte Themen