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
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()
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'),
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
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.
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
- 1. Wie können wir Benutzern erlauben, ihre eigenen Felder für Formulare in Django zu erstellen?
- 2. Auf Jenkins erlauben Sie Benutzern, ihre eigenen Anmeldeinformationen aber nicht globale zu behandeln
- 3. Benutzern erlauben, ihren Account zu entfernen
- 4. Ermöglicht Android Benutzern, ihre eigenen Schriftarten zu liefern?
- 5. Erlauben Sie Benutzern, Ihre eigene kostenpflichtige App kostenlos in Android
- 6. Benutzern erlauben, disqus/facebook comments plugin hinzuzufügen
- 7. Speichert Disqus Ihre Kommentare?
- 8. Benutzern erlauben, Geolocation manuell zu überbrücken
- 9. Wie können Benutzer ihre eigenen Passwörter in Django ändern?
- 10. Benutzern erlauben, die Daten des anderen im Firebase zu sehen
- 11. Benutzern erlauben Pfad in tkinter askopenfilename eingeben()
- 12. Lassen Sie MySQL-Benutzer Datenbanken erstellen, sondern nur ihre eigenen Datenbanken Zugriff erlauben
- 13. Ist es sicher, Benutzern das Bearbeiten von CSS zu erlauben?
- 14. Mehrere WebSecurityConfiguratorAdapter: eine als Bibliothek, in den anderen Benutzern können ihre eigenen Sicherheitszugriff hinzufügen
- 15. Wie Benutzern erlauben, nur bestimmte Felder
- 16. Den Benutzern erlauben, die Konfigurationsdatei nach der Bereitstellung zu bearbeiten
- 17. Benutzern erlauben, BBCode oder HTML mit WYSIWYG zu posten?
- 18. Wie viel Flexibilität erlauben Sie Benutzern, Uids zu erstellen?
- 19. Sie Ihre eigenen Schlüsselpfad Operatoren in Kakao
- 20. Ihre eigenen reduceByKey in Spark-Dataset
- 21. Möglich, Ihre eigenen HTTP-URL-Schemata in iOS zu behandeln?
- 22. Hinzufügen von benutzerdefinierten Feldern zu Benutzern in Django
- 23. joomla-sharts Artikel Zugriff von mehreren Benutzern auf ihre eigenen Artikel
- 24. Vorgefüllte Benutzerinformationen in Django Kommentare?
- 25. Django Kommentare umgekehrte Beziehung
- 26. Django: Facebook Kommentare Integration
- 27. Django Kommentare Framework-Probleme
- 28. django statische Kommentare
- 29. Löschen von Benutzern von Moodle
- 30. Zählen Kommentare pro Objekt in `models.py` mit Django Kommentare Framework
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. –
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
Sie müssen keinen POST senden, Sie können nur nachahmen, was die Ansicht 'comments' bewirkt; siehe Bearbeiten. –