简体   繁体   English

Python Django request.user 在 Class 基于视图和查询集中的最佳实践

[英]Python Django Best Practice for request.user in Class Based Views and Queryset

I am using class based views and have always the same problem without an elegant solution.我正在使用基于 class 的视图,并且在没有优雅解决方案的情况下总是遇到同样的问题。 My querysets should only show the ones that are owned of the request user.我的查询集应该只显示请求用户拥有的那些。

Code代码

view:看法:

class MyListView(ListView):
    model = MyModel

    def get_queryset(self):
        return self.model.objects.owned_by_user(self.user)

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.user = None

    def dispatch(self, request, *args, **kwargs):
        self.user = request.user

        return super().dispatch(request, *args, **kwargs)

model: model:

class MyModelQuerySet(models.QuerySet):
    def owned_by_user(self, user):
        return self.filter(user_field=user)


class MyModelManager(models.Manager):
    def get_queryset(self):
        return MyModelQuerySet(self.model, using=self._db)

    def owned_by_user(self, user):
        return self.get_queryset().owned_by_user(user)


class MyModel(models.Model):
    user_field = ...

    objects = ProductRequestManager()

Best practice 1:最佳实践 1:

I think I have to overwrite dispatch to add the request.user.我想我必须覆盖调度才能添加 request.user。 My IDE notes "Instance attribute user defined outside of init . In order to prevent this I also need to overwrite init (). How can I achieve this with less code?我的 IDE 注释“实例属性用户在init之外定义。为了防止这种情况,我还需要覆盖init ()。我怎样才能用更少的代码实现这一点?

Best practice 2:最佳实践 2:

Is there another way to get querysets belonging to the current user?是否有另一种方法来获取属于当前用户的查询集?

You just filter the queryset with self.request.user .您只需使用self.request.user过滤查询集。 Note that the setup() method will assign values to self.request , self.args , and self.kwargs :请注意, setup()方法将为self.requestself.argsself.kwargs

class MyListView(ListView):
    model = MyModel

    def get_queryset(self):
        return self.model.objects.owned_by_user(self.request.user)

Note : You can limit views to a class-based view to authenticated users with the LoginRequiredMixin mixin [Django-doc] .注意:您可以使用LoginRequiredMixin mixin [Django-doc]将视图限制为基于类的视图,以供经过身份验证的用户使用。

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

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