【问题标题】:Django UpdateView user validation not workingDjango UpdateView 用户验证不起作用
【发布时间】:2020-09-14 04:25:19
【问题描述】:

大家好,我有这个更新视图,我无法验证用户(所有者)。如何调整这个以添加那个位。?请看代码。

class StoreInfoView(UpdateView, LoginRequiredMixin):
    model = Store
    template_name = 'store/store_information.html'
    form_class = StoreInfoForm
    success_message = 'Updated'
    success_url = reverse_lazy('store:store_home')

    def get_object(self, queryset=None):
        obj = Store.objects.get(id=self.kwargs['id'])
        if obj.user != self.request.user:
            raise PermissionDenied('You Don\'t have permission to edit!')
        return obj

    def get(self, *args, **kwargs):
        self.object = Store.objects.get(id=self.kwargs['id'])
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(object=self.object, form=form)
        return self.render_to_response(context)

谢谢

【问题讨论】:

  • 当您说验证不起作用时,您的意思是任何用户都可以更新对象吗?
  • 是的..任何用户都可以编辑

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:

您可以简单地覆盖get_queryset() 方法,而不是像这样覆盖。像这样:

class StoreInfoView(UpdateView, LoginRequiredMixin):
    model = Store
    template_name = 'store/store_information.html'
    form_class = StoreInfoForm
    success_message = 'Updated'
    success_url = reverse_lazy('store:store_home')

    def get_queryset(self, *args, **kwargs):
        queryset = super().get_queryset(*args, **kwargs)
        return queryset.filter(user=self.request.user)

这样,非所有者用户在尝试更新时会收到 404 错误。

此外,您不需要覆盖任何其他方法,例如 get()get_object() 方法。

【讨论】:

  • 您好,感谢您的回复。但它无法显示此错误 Generic detail view StoreInfoView must be called with an object pk or a slug in the URLconf.
  • 你没有使用 pk 或 slug,比如 url 中的path('storeinfo/<pk>/',StoreInfoView.as_view())
【解决方案2】:

您的问题的问题是继承顺序。当你浏览LoginRequiredMixin 的官方文档时,你会发现这个

这个mixin应该在继承列表的最左边。

请将您的代码更新为此

class StoreInfoView(LoginRequiredMixin, UpdateView):
    model = Store
    template_name = 'store/store_information.html'
    form_class = StoreInfoForm
    success_message = 'Updated'
    success_url = reverse_lazy('store:store_home')

    ...

注意,现在LoginRequiredMixin 放在UpdateView 之前。这应该可以解决您的问题。

我希望它有所帮助。 :)

【讨论】:

  • 感谢您的回复,但它不起作用,任何人都可以编辑帖子
  • 我明白了,你能不能告诉它是否至少不允许非登录用户。?我的意思是如果用户没有登录,那么它能够检测到吗?
  • 不,他无法访问该页面。我刚才试过了。 :)
猜你喜欢
  • 2013-04-02
  • 2018-12-25
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 2017-07-14
  • 2016-10-17
  • 2013-12-02
  • 2018-06-10
相关资源
最近更新 更多