【问题标题】:How to restrict users voting on their own model如何限制用户对自己的模型投票
【发布时间】:2009-06-16 14:28:48
【问题描述】:

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

如何在不修改 django-voting 应用程序的情况下限制用户对将特定用户设置为作者的模型进行投票?

Django 中间件是我首先想到的,但我不明白它的“proces_view”功能。如果您认为中间件是正确的方法,请举例说明如何做。

【问题讨论】:

    标签: django django-middleware django-voting


    【解决方案1】:

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

    我没有运行这段代码,可能是不正确的,但我希望思路清晰

    【讨论】:

    • 是的,这个想法很明确。它正在工作。仅供将来参考,此代码不能放入 settings.py 中。把它放在一个肯定会执行的文件中,除了settings.py。例如在您的应用程序中的 models.py 中。
    • 我认为这是更好的方法。这样,逻辑也是为 AJAX 调用编写的,并且在一个地方。
    • 如果您的项目中有可以投票的对象没有“用户”属性,请小心使用此代码。在这种情况下,您将需要添加一个 hasattr(obj, 'user') 检查或将所有内容包装在尝试中...除了 AttributeError。
    • 这比我拥有的要优雅得多......也许我应该重构:)
    【解决方案2】:

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

    【讨论】:

    • 这太明显了,我不知道为什么我一开始不这样做。两个答案都是正确的。接受哪个:)?
    • 这种方法的缺点是你必须进行额外的数据库查询来获取被投票的对象,然后在 django-voting 自己的视图中重复。所以另一种解决方案更高效、更干,尽管这个不需要猴子补丁。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      相关资源
      最近更新 更多