Question

J'utilise django-vote comme application de vote pour deux de mes modèles. Ces deux modèles comportent des champs "auteur".

Comment puis-je empêcher un utilisateur de voter sur un modèle qui a cet utilisateur particulier défini comme auteur sans modifier l'application de vote django?

Le middleware Django est la première chose qui me vienne à l’esprit, mais je ne comprends pas qu’il soit "proces_view". une fonction. Si vous pensez que le middleware est la bonne solution, pourriez-vous s'il vous plaît donner un exemple de la façon de le faire.

Était-ce utile?

La solution

Ajoutez ce code n'importe où dans votre 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)

Je n'ai pas exécuté ce code, c'est peut-être incorrect, mais j'espère que l'idée est claire

Autres conseils

Plutôt qu'un hack de middleware, pourquoi ne pas réacheminer les demandes vers cet URI particulier via une autre vue? Vous pouvez ensuite exécuter la logique de votre choix et appeler ensuite la vue d'origine, le cas échéant.

Une autre idée consiste à utiliser le le signal post_save

.

comme ça:

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)

L'avantage de procéder ainsi par rapport au remplacement de VoteManager.record_vote est qu'il est moins étroitement couplé au module de vote et que, s'ils apportent des modifications, ils risquent moins de casser votre code

modifier : comme dans la réponse de Glader, vous devez vous assurer que tous les objets sur lesquels vous votez ont un attribut "utilisateur".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top