Как ограничить голосование пользователей по собственной модели - PullRequest
2 голосов
/ 16 июня 2009

Я использую django-голосования в качестве приложения для голосования для двух моих моделей. В обеих этих моделях есть поля "автор".

Как я могу запретить пользователю голосовать за модель, для которой этот конкретный пользователь установлен в качестве автора, без изменения приложения для голосования django?

Промежуточное программное обеспечение Django - это первое, что приходит мне в голову, но я не понимаю, что это за функция «process_view». Если вы считаете, что промежуточное ПО - правильный путь, не могли бы вы привести пример того, как это сделать.

Ответы [ 3 ]

4 голосов
/ 16 июня 2009

Добавьте этот код в любом месте вашего 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)

Я не запускал этот код, возможно, он неверный, но я надеюсь, что идея ясна

2 голосов
/ 16 июня 2009

Вместо того, чтобы взламывать промежуточное ПО, почему бы не перенаправить запросы на этот конкретный URI через другое представление? Затем вы можете выполнять любую логику, которая вам нравится, и впоследствии вызывать исходное представление, если это уместно.

0 голосов
/ 19 июня 2009

Другая идея - использовать сигнал 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 заключается в том, что он менее тесно связан с модулем голосования, и если они вносят изменения, он с меньшей вероятностью нарушит ваш код.

edit : как и в ответе Глейдера, вы должны убедиться, что все объекты, по которым вы голосуете, имеют атрибут 'user'.

...