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

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

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,而不是中间件黑客呢?然后你可以执行你喜欢的任何逻辑,然后在适当的时候调用原始视图。

另一个想法是使用 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的回答一样,您需要确保您投票的所有对象都具有“用户”属性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top