如何限制用户对自己的模型进行投票
-
05-07-2019 - |
题
我使用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的回答一样,您需要确保您投票的所有对象都具有“用户”属性。
不隶属于 StackOverflow