Come limitare il voto degli utenti sul proprio modello
-
05-07-2019 - |
Domanda
Sto usando django-voting come applicazione di voto per due dei miei modelli. Entrambi i modelli hanno campi "autore".
Come posso impedire a un utente di votare un modello che ha impostato questo particolare utente come autore senza modificare l'app di voto di django?
Il middleware Django è la prima cosa che mi viene in mente, ma non capisco che sia " proces_view " funzione. Se pensi che il middleware sia il modo giusto, potresti fare un esempio di come farlo.
Soluzione
Aggiungi questo codice ovunque nel tuo settings.py:
from voting.managers import VoteManager
def check_user(func):
def wrapper(self, obj, user, vote):
if obj.user != user:
return func(self, obj, user, vote)
else:
return None
# or raise some exception
return wrapper
VoteManager.record_vote = check_user(VoteManager.record_vote)
Non ho eseguito questo codice, forse non è corretto, ma spero che l'idea sia chiara
Altri suggerimenti
Piuttosto che un hack del middleware, perché non reindirizzare le richieste a quel particolare URI attraverso un'altra vista? Quindi puoi eseguire la logica che preferisci e successivamente chiamare la vista originale se appropriato.
Un'altra idea è quella di utilizzare il segnale post_save
in questo modo:
from django.db.models.signals import post_save
from voting.models import Vote
def check_user(sender, instance, **kwargs):
if instance.user == instance.object.user:
instance.delete()
# do some other stuff to tell the user it didn't work
post_save.connect(check_user, sender=Vote)
Il vantaggio di fare questo rispetto alla sostituzione di VoteManager.record_vote
è che è meno strettamente accoppiato al modulo di voto, e se apportano modifiche è meno probabile che rompa il tuo codice
modifica : come nella risposta di Glader, devi assicurarti che tutti gli oggetti su cui stai votando abbiano un attributo "utente".