我正在使用 django-voting 作为我的两个模型的投票应用程序。这两个模型都有“作者”字段。
如何在不修改 django-voting 应用程序的情况下限制用户对将此特定用户设置为作者的模型进行投票?
Django 中间件是我想到的第一件事,但我不明白它的“proces_view”功能。如果您认为中间件是正确的方法,请举例说明如何做。
我正在使用 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,而不是中间件 hack?然后您可以执行您喜欢的任何逻辑,然后在适当的情况下调用原始视图。
另一个想法是使用post_save 信号
像这样:
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
是它与投票模块的耦合不那么紧密,如果他们进行更改,那么破坏您的代码的可能性就会降低
编辑:正如格拉德的回答,您需要确保您投票的所有对象都具有“用户”属性。