如何限制用户对自己的模型进行投票

时间:2009-06-16 14:28:48

标签: django django-middleware django-voting

我使用django-voting作为我的两个模型的投票应用程序。这两个模型都有“作者”字段。

如何在不修改django-voting app的情况下限制用户对具有此特定用户设置的模型进行投票?

Django中间件是我想到的第一件事,但我不明白它是“proces_view”功能。如果您认为中间件是正确的方式,请举例说明如何操作。

3 个答案:

答案 0 :(得分:4)

将此代码添加到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)

我没有运行此代码,也许这是不正确的,但我希望这个想法很明确

答案 1 :(得分:2)

为什么不通过另一个视图将请求重新路由到特定的URI,而不是中间件黑客呢?然后你可以执行你喜欢的任何逻辑,然后在适当的时候调用原始视图。

答案 2 :(得分:0)

另一个想法是使用post_save signal

像这样:

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的好处是,它与投票模块的联系不那么紧密,如果他们进行更改,则不太可能破坏您的代码

编辑:与Glader的回答一样,您需要确保您投票的所有对象都具有“用户”属性。