我试图通过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)
答案 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
对象仅限用户作为客户端。
我不确定您使用哪个网址来访问该活动,以及OneToOne
和Event
之间只有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!