我使用django-voting作为我的两个模型的投票应用程序。这两个模型都有“作者”字段。
如何在不修改django-voting app的情况下限制用户对具有此特定用户设置的模型进行投票?
Django中间件是我想到的第一件事,但我不明白它是“proces_view”功能。如果您认为中间件是正确的方式,请举例说明如何操作。
答案 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的回答一样,您需要确保您投票的所有对象都具有“用户”属性。