繁体   English   中英

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

[英]Django - Pass related object as variable in user_passes_test mixin

我试图将对象的实例限制为只能由该对象通过OneToOneField引用的用户查看。 我在DetailView上使用“ user_passes_test”混合输入来将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)

如果使用的是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对象限制为仅作为客户端的用户。

我不确定您使用什么URL来访问Event以及为什么EventUser之间只有OneToOne关系。 但是,如果它是一个OneToOne关系,则此实现后的queryset将仅包含一个对象。 (它可能是访问此事件的主键,也可能不是)。

我终于明白了,我认为花了我的力气才意识到我可以在查询集上设置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!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM