Używam funkcji delete() z modułu django.contrib.comments.views.moderation. Członek personelu może usunąć WSZELKIE komentarze, co jest całkowicie w porządku. Chciałbym jednak również dać zarejestrowanym pracownikom niebędącym pracownikami przywilej do usuwania własnych komentarzy i ich własnych OWN. Jak mogę to zrobić?Umożliwianie użytkownikom usuwania własnych komentarzy w Django
Odpowiedz
Jeśli chcesz oznaczyć komentarz jako usunięte, tak jak robi 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()
Chociaż jest to trochę późno, nie można zrobić to samo podobnie w szablonie?
{% if user == comment.user %}
<a href="{% url comments-delete comment.id %}">delete comment</a>
{% endif %}
używa Django komentarze URL:
url(r'^delete/(\d+)/$', 'moderation.delete', name='comments-delete'),
Myślałem o tym też. Jednak ta funkcja usuwania wymaga, aby użytkownik miał uprawnienie do usuwania komentarzy. Jeśli dam każdemu normalnemu użytkownikowi zgodę na usunięcie jakiegokolwiek komentarza, będę miał poważny problem z bezpieczeństwem. – RaDeuX
po prostu wpadł na ten problem.
Po prostu ponowne wprowadzenie logiki w widoku usuwania aplikacji komentarzy spowoduje powiązanie implementacji z określoną wersją aplikacji komentarzy. Na przykład aplikacja komentarzy również obsługuje sygnały, gdy oznaczysz coś jako usunięte, a podana wersja tego nie robi.
Na szczęście aplikacja komentarzy zapewnia funkcję, która implementuje logikę core core bez żadnych uprawnień. Używanie go wiąże się z wewnętrznymi szczegółami, ale robi to w bardzo specyficzny sposób, który albo się załamie, albo zadziała, nigdy nie będzie działał w połowie. Możesz stworzyć swój własny pogląd z własnym modelu zabezpieczeń, a następnie zadzwonić podaną funkcję komentarz app (z django.contrib.comments.views.moderation importowej perform_delete)
kod będzie wyglądał mniej więcej tak:
@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
Dane osobowe będą różne w zależności od przypadku użycia.
Przeszedłem kilka odmian (które można zobaczyć w historii tego komentarza) i myślę, że ten jest lepszy pod każdym względem niż oryginalne rozwiązanie oferowane tutaj.
Uzgodnione. Używanie 'perform_delete' jest lepszym rozwiązaniem, ponieważ: 1) odłączyć rzeczywistą logikę usuwania komentarzy. 2) perform_delete tak naprawdę nie usuwa, ale zaznacza komentarz jako usunięty. 3) perform_delete uruchamia sygnał comment_was_flagged, którego używam do aktualizacji naszego indeksu wyszukiwania – mynameistechno
- 1. Umożliwianie użytkownikom wybierania niestandardowego motywu w Railsach
- 2. Umożliwianie użytkownikom końcowym dynamicznego dodawania kolumn do tabeli
- 3. Regex do usuwania komentarzy w pliku XML w Eclipse Java
- 4. Pisanie zagnieżdżonych komentarzy w Django/Pythonie
- 5. Jak można zachować parser yaml-cpp z usuwania wszystkich komentarzy?
- 6. Wyrażenie regularne służące do usuwania komentarzy z instrukcji SQL
- 7. Usuń domyślną akcję usuwania w Django admin
- 8. Szyny 3 - Obsługa wiadomości przychodzących (Umożliwianie użytkownikom odpowiedzi na powiadomienia e-mail)
- 9. Jak zezwolić użytkownikom na tworzenie własnych poddomen w mojej witrynie MVC?
- 10. Jak filtrować obiekty w celu zliczania komentarzy w Django?
- 11. Czy istnieje narzędzie do raportowania, które umożliwia użytkownikom tworzenie własnych raportów?
- 12. AWS Polityka IAM umożliwiająca użytkownikom zmianę własnych haseł podczas blokowania dostępu do IAM
- 13. CanCan - Jak zezwolić użytkownikom na aktualizowanie i usuwanie tylko własnych obiektów
- 14. Umożliwianie dostępu do określonego użytkownika
- 15. Uzyskiwanie IntelliSense na interfejsie, który implementuje metoda, jeśli ta metoda nie ma własnych komentarzy XML.
- 16. Administrator Django - czy można ograniczyć dostęp użytkownika tylko do jego własnych danych wejściowych?
- 17. Przypisywanie ról użytkownikom aplikacji
- 18. django-allauth: zezwalaj tylko użytkownikom z określonej domeny Google Apps
- 19. Django - pozostawianie wiadomości użytkownikom (offline) za pomocą nowej struktury wiadomości
- 20. Administrator Django - dając użytkownikom dostęp do konkretnych obiektów/pól?
- 21. Django AssertionError "sensitive_post_parameters nie otrzymał HttpRequest" on użytkownikom dodawanie admin
- 22. Usuwanie wszystkich typów komentarzy w pliku Javy
- 23. Generowanie komentarzy/komentarzy dla metody Kotlin
- 24. SearchManager - dodawanie własnych sugestii
- 25. RailsAdmin - Dostosowywanie własnych filtrów
- 26. Pozwól użytkownikom dodawać komentarze disqus/facebook wtyczka
- 27. Zrozumienie usuwania i usuwania relacji w greenDao
- 28. Tworzenie własnych funkcji XSLT
- 29. Dodawanie własnych reguł Lint
- 30. Umożliwianie Ctrl-C przerywania pythonowego rozszerzenia C
Lubię korzystać z Http404 w tym przypadku, ponieważ ujawnia on niewiele informacji o systemie, jeśli ktoś muckuje za pomocą adresów URL. 'if comment.user! = request.user: raise Http404' Możesz również użyć' get_object_or_404', aby pobrać komentarz, który ma więcej sensu niż błąd 500, jeśli w adresie URL zostanie wysłany zły identyfikator message_id. –
Powyższy przykład prawie działa. Powinienem był powiedzieć, że chciałem, aby komentarze zostały zgłoszone do usunięcia, zamiast faktycznie usuwać komentarze. Aby to zrobić, wydaje mi się, że muszę wysłać żądanie POST. Jak wysłać żądanie POST w przeciwieństwie do GET? – RaDeuX
Nie musisz wysyłać POST, możesz po prostu naśladować to, co robi widok 'comments'; patrz edycja. –