Django - 将相关对象作为变量传递给user_passes_test mixin

时间:2017-01-13 14:16:17

标签: python django django-views

我试图通过OneToOneField将对象的实例限制为只能被该对象引用的用户查看。我在DetailView上使用“user_passes_test”mixin将request.user与OnetoOne关系中的用户进行比较。我在django irc上得到了一些帮助,这导致我尝试并实现了get_object失败,但我仍然陷入困境(我是Django& Python的新手)。

模特:

class Event(models.Model):     
    client = models.OneToOneField(settings.AUTH_USER_MODEL)

视图:

class EventDetail(UserPassesTestMixin, DetailView):
    model = Event

    def test_func(self):
        if self.request.user == self.model.client:
            return True
        else:
            return False

用户在自己的应用中被引用,如User(AbstractUser)

2 个答案:

答案 0 :(得分:2)

如果您使用DetailView,则可以在视图中实施get_queryset方法:

class EventDetail(DetailView):
    model = Event

    def get_queryset(self):
        queryset = super(DetalView, self).get_queryset()
        return queryset.filter(client=self.request.user)

这将确保Event对象仅限用户作为客户端。

我不确定您使用哪个网址来访问该活动,以及OneToOneEvent之间只有User关系的原因。但如果它是OneToOne关系,那么此实现后的queryset将只包含一个对象。 (可能是也可能不是您访问此事件的主键)。

答案 1 :(得分:1)

我终于明白了,我认为我把它写出来意识到我可以像这样在查询集上添加if / else条件:

def get_queryset(self):
    queryset = super(DetailView, self).get_queryset()
    if self.request.user.is_staff:
        return queryset
    else:
        return queryset.filter(client=self.request.user)

谢谢AKS!