Как ограничить голосование пользователей по их собственной модели
-
05-07-2019 - |
Вопрос
Я использую django-voting в качестве приложения для голосования для двух моих моделей.Эти обе модели имеют поля "автор".
Как я могу запретить пользователю голосовать за модель, в которой этот конкретный пользователь указан в качестве автора, без изменения приложения django-voting?
Промежуточное программное обеспечение Django - это первое, что приходит мне в голову, но я не понимаю, что это за функция "proces_view".Если вы считаете, что промежуточное программное обеспечение - это правильный способ, не могли бы вы, пожалуйста, привести пример того, как это сделать.
Решение
Добавьте этот код в любое место вашего 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 через другое представление?Затем вы можете выполнить любую логику, которая вам нравится, и впоследствии вызвать исходное представление, если это уместно.
Другая идея состоит в том, чтобы использовать сигнал пост_сохранения
вот так:
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
заключается в том, что он менее тесно связан с модулем голосования, и если они внесут изменения, это с меньшей вероятностью нарушит ваш код
Редактировать:как и в ответе Глэйдера, вам нужно убедиться, что все объекты, за которые вы голосуете, имеют атрибут "user".