Как ограничить голосование пользователей по собственной модели
Я использую Django-голосование в качестве приложения для голосования двух моих моделей. У обеих моделей есть поля "автор".
Как я могу запретить пользователю голосовать за модель, для которой этот конкретный пользователь установлен как автор, без изменения приложения django-голосования?
Промежуточное программное обеспечение Django - это первое, что приходит мне в голову, но я не понимаю, что это за функция "process_view". Если вы считаете, что промежуточное ПО - правильный путь, не могли бы вы привести пример того, как это сделать.
3 ответа
Добавьте этот код в любом месте вашего 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)
Я не запускал этот код, возможно, он неправильный, но я надеюсь, что идея ясна
Вместо того, чтобы взламывать промежуточное ПО, почему бы не перенаправить запросы на этот конкретный URI через другое представление? Затем вы можете выполнять любую логику, которая вам нравится, и впоследствии вызывать исходное представление, если это необходимо.
Другая идея - использовать сигнал post_save.
вот так:
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)
Преимущество делать это против переопределения VoteManager.record_vote
является то, что он менее тесно связан с модулем голосования, и если они вносят изменения, это менее вероятно, нарушит ваш код
изменить: как и в ответе Глейдера, вы должны убедиться, что все объекты, по которым вы голосуете, имеют атрибут "пользователь".