首页 > 解决方案 > Django 用户访问控制

问题描述

例如,我有一个模型Post

class Post(models.Model):
    task = models.ForeignKey("User")

我希望用户只能访问自己创建的帖子,但有太多视图列出了一些帖子以在每个视图中重写查询集。

那么有没有什么优雅的方式来控制用户访问呢?在线程中保存并获取当前用户并实现一个新ManagerPost是一种方法,但我不知道为什么不推荐这样做。

标签: django

解决方案


假设您使用的是通用ListView(Django-doc)。您可以覆盖视图的get_queryset(...)(Django-doc)方法,如下所示,

class PostListView(ListView):
    def get_queryset(self):
        return Post.objects.filter(task=self.request.user)

通用解决方案

首先你需要创建一个mixin类,

class GenericLoggedInMixin:
    user_field_name = None

    def get_queryset(self):
        queryset = super().get_queryset()
        if self.user_field_name:
            return queryset.filter(**{self.user_field_name: self.request.user})
        return queryset

并在您看来继承相同,

class PostListView(GenericLoggedInMixin, ListView):
    user_field_name = 'task'

推荐阅读