Skip to main content
 首页 » 编程设计

python之Django之在 user_passes_test 混合中将相关对象作为变量传递

2024年08月21日30mate10pro

我正在尝试限制一个对象的实例,使其仅对该对象通过 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) 

View :

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,那么您可以在 View 中实现 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 和 User 之间只有 OneToOne 关系。但如果它是一个OneToOne 关系,那么这个实现之后的queryset 将只包含一个对象。 (它可能是也可能不是您访问此事件所使用的主键)。