【问题标题】:How to allow only authors of the entry to edit it in UpdateView logic如何仅允许条目的作者在 UpdateView 逻辑中对其进行编辑
【发布时间】:2019-08-21 16:47:11
【问题描述】:

问题出在:我有一个更新视图,其中覆盖了 get_object 方法:

class MyUpdateView(SuccessMessageMixin, LoginRequiredMixin, UpdateView):

some code here:

    def get_object(self, queryset=None):
        obj = UpdateView.get_object(self, queryset=None)
        if not obj.author == self.request.user:
            redirect(reverse_lazy("app:url")) # or reverse instead  , no difference
        return obj

附言object.author 通过外键绑定到用户模型(在我们的例子中为 self.request.user)

在此视图中,我希望仅允许对创建此确切条目的用户编辑条目。我知道如何通过 get_queryset 或通过 UserPassesTestMixin 来做到这一点,但这两种方法都会引发错误。相反,我需要将不是作者的用户重定向回他来自的页面或某个 URL(参数)。

在这种情况下(代码如下)它工作正常,出现 404 ,所以逻辑工作。我通过网站尝试过:作者可以编辑条目,非作者会变出 404。


# in this case it forks fine,  404 appears :

 def get_object(self, queryset=None):
        obj = UpdateView.get_object(self, queryset=None)
        if not obj.author == self.request.user:
            raise Http404
        return obj

但在第一个示例中,由于某种原因重定向不起作用。

我尝试过 - get_querysetUserPassesTestMixin,但这不是我需要的

autor = request.user - 允许编辑条目

author != request.user - 转到上一页 ot 到某个 URL + 消息

如果有人知道如何在这种情况下使用重定向 - 请回答。有美好的一天

---解决方案---


    def get(self, request, **kwargs):
        if self.get_object().author == self.request.user:
            return UpdateView.get(self, request, **kwargs)
        else:
            messages.add_message(request, messages.WARNING, "You can only change your own entries")
            return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

【问题讨论】:

    标签: django django-views


    【解决方案1】:

    You need to go backthen aware the user with a message using the django message framework 正确的做法是

    from django.http import HttpResponseRedirect
    
    def someview(request):
       ...
       return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    

    【讨论】:

    • 非常感谢伙计,它确实有效。我已将我所做的 (def get()) 添加到原始问题中。
    • @Iakovos Belonias 。顺便说一句,有什么方法可以将用户重定向到甚至落后一步,即上一页到上一页???我的意思是使用 META 数据?
    • 一定要检查这些链接。 stackoverflow.com/questions/35894990/… stackoverflow.com/questions/12758786/… stackoverflow.com/questions/50006147/… 如果您仍然遇到问题,请告诉我。如果您可以将项目上传到 github(一般而言),这也会有很大帮助
    • @Iakovos Belonias 嗯,这不是一个很大的项目。只是尝试通过尽可能多地犯错并通过不同的方法以相同的混乱方式修复它们来学习 Django。
    • 没关系,将代码上传到 github 是一个不错的起点。我现在主要使用我的 github 作为项目参考,因为我遇到了大部分问题。 github 的好处是你可以随时回来检查一些东西。大/小项目无所谓
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    相关资源
    最近更新 更多