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
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()
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'),
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
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.
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
- 1. Permettere agli utenti di scegliere un tema personalizzato in Rails
- 2. Consentire agli utenti di aggiungere plug-in commenti disqus/facebook
- 3. Permettere agli utenti di inserire solo tag specifici
- 4. Permettere agli utenti di caricare script Python per l'esecuzione
- 5. Permettere agli utenti di ssh su un'istanza di Ubuntu EC2?
- 6. Permettere agli utenti di utilizzare domini personalizzati per Django app su Heroku
- 7. C'è uno strumento di report che consente agli utenti di creare i propri report?
- 8. Come consentire agli utenti di creare i propri sottodomini sul mio sito Web MVC?
- 9. Nel multisite wordpress come posso consentire agli utenti di installare i propri plugin?
- 10. Aggiunta di campi personalizzati agli utenti in django
- 11. Consenti agli utenti di ordinare i post in Wordpress
- 12. Usa i commenti django-contrib (l'app) in nuovi progetti Django?
- 13. Permettere agli utenti di ritagliare e ridimensionare le immagini Ruby on Rails
- 14. Va bene aggiungere i propri attributi agli elementi HTML?
- 15. Permettere il carattere "-" nei nomi utente nell'interfaccia di Django Admin
- 16. CouchDB: Limitazione degli utenti solo a replicare i propri documenti
- 17. admin Django - dando agli utenti l'accesso a specifici oggetti/campi?
- 18. Google fornisce agli utenti di test i test di integrazione
- 19. È sicuro consentire agli utenti di modificare i CSS?
- 20. come mettere i commenti in modelli di Django
- 21. come impedire agli utenti di chiudere una finestra in javascript?
- 22. Utilizzo dell'app dello schedulatore Django con i propri modelli
- 23. Quali problemi di sicurezza vengono visualizzati quando gli utenti possono caricare i propri file?
- 24. Commenti autentificati in Django 1.1?
- 25. Django: integrazione commenti Facebook
- 26. Come posso impedire agli utenti anonimi di eliminare/modificare i miei documenti in CouchDB?
- 27. Come distribuire Python agli utenti di Windows?
- 28. I commenti degli utenti non vengono visualizzati su Google Play
- 29. Estendere il pacchetto agli utenti di mean.io
- 30. Concedere agli utenti anonimi la stessa funzionalità di quelli registrati
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. –
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
Non è necessario inviare un POST, si può semplicemente imitare ciò che fa la vista 'commenti'; vedi modifica. –