Как ограничить голосование пользователей по их собственной модели

StackOverflow https://stackoverflow.com/questions/1001856

Вопрос

Я использую 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".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top