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.

È stato utile?

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".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top