【问题标题】:Django Allow Interaction with Users Data OnlyDjango 只允许与用户数据交互
【发布时间】:2019-03-14 15:35:05
【问题描述】:

我正在向 Django 应用程序添加一些用户配置文件行为,并且像往常一样,我想限制用户只能与他们自己的数据进行交互。此 SO Q&A 与流程本身有关:

Django--- Allowing Users to only edit their profile

在创建、更新和删除查询中添加经过身份验证的用户 ID 就足够了吗?为了减少代码重复,我在想我可以编写一个 mixin 来覆盖 get_objectget_queryset 并通过添加 self.request.user.pk 来拦截查询以过滤结果?

还有其他有效的方法可以做到这一点,或者 Django 本身的 mixin 吗?

编辑这就是我的想法:

    class OwnersDataOnlyViewMixin(object):
    def get_object(self, queryset=None):
        if self.model == get_user_model():
            # user model, so pk of model should match self.request.user.pk
            return super().get_object(self.model.objects.filter(pk=self.request.user.pk))
        else:
            # different model
            try:
                # check for the 'user' field and filter on it if found
                user_field = self.model._meta.get_field('user')
                return super().get_object(self.model.objects.filter(user=self.request.user))
            except:
                # Mixin was used with model data not associated with a user
                raise self.model.DoesNotExist      

可能有更灵活的方法可以做到这一点,我愿意接受改进的建议。

【问题讨论】:

    标签: django django-models django-views django-authentication


    【解决方案1】:

    对于基于类的视图,您很可能需要覆盖 get_querset() 方法,因为它返回的查询集将用于获取数据以进行编辑和删除,因此返回类似 MyModel.objects.filter(owner=self.request.user) 的内容。请注意,如果用户试图访问不属于他的对象,这将导致404 - “未找到”响应。

    创建新对象后,您主要需要将request.user 设置为新创建对象的所有者。这可以通过自定义CreateViewform_valid() 方法来完成:

    class MyCreateView(LoginRequiredMixin, generic.CreateView):
    
        def form_valid(self, form):
            form.instance.owner = self.request.user
            return super().form_valid(form)
    

    根据您的模型结构,您可以将此方法添加到 mixin 并将它们与通用视图一起使用。

    【讨论】:

    • 我认为你所描述的正是我刚刚结束的地方,除了我做了get_object,因为如果get_object 在其他地方被覆盖,则不能保证调用get_queryset。再说一次,我想我自己的覆盖也存在同样的问题。对于创建视图,我使用form.instance 做了类似于您建议的操作。
    • 我接受了你的回答,因为这几乎是我最终的结果,而且似乎是正确的做法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多