【问题标题】:Django - Redirect Unauthenticated User trying to access UpdateView to DetailViewDjango - 将尝试访问 UpdateView 的未经身份验证的用户重定向到 DetailView
【发布时间】:2022-08-18 16:41:35
【问题描述】:

这是我最后一次脑细胞说话。
我有一个模型叫邮政带有标题、正文、作者、徽标和 pub_date 字段。
我的应用中有一个页面,用户可以更新/编辑帖子。我希望将用户重定向到帖子的详细信息页面如果他们试图在没有登录的情况下访问它。
问题是我无法引用发帖的pk将用户重定向到相关页面,如果我想简单地说:
尝试访问.../2/edit/ 的用户如果未登录,将被重定向到.../2/

我尝试使用登录必填Mixin阻止用户,但我无法将用户重定向到相关详细信息页面。

网址.py:

urlpatterns = [
    path(\'\', PostListView.as_view(), name=\'index\'),
    path(\'<int:pk>/\', PostDetailView.as_view(), name=\'details\'),
    path(\'new/\', PostCreateView.as_view(), name=\'new_post\'),
    path(\'<int:pk>/edit\', PostUpdateView.as_view(), name=\'update_post\'),
]

视图.py:

class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post
    login_url = reverse_lazy(\'details\', args=[self.object.pk,]) 
    form_class = PostUpdateForm
    template_name = \"posts/update_post.html\"

我也试过:

class PostUpdateView(LoginRequiredMixin, UpdateView):
    def get_login_url(self) -> str:
        super().get_login_url()
        UpdateView.get(self, self.request)
        self.login_url = reverse_lazy(\'details\', args=[self.object.pk,])
    model = Post
    form_class = PostUpdateForm
    template_name = \"posts/update_post.html\"

但它返回一个空/无价值

登录必填Mixin甚至是正确的方法?
我知道这很容易实现通用视图/更新视图只是通过获取请求并自己处理它,但不是通用视图应该更容易完成工作?

    标签: python django django-views django-generic-views


    【解决方案1】:

    我不知道您的 Post 模型中用户字段的名称是什么。我以为是作者。

    class PostUpdateView(LoginRequiredMixin, UpdateView):
        model = Post
        login_url = reverse_lazy('details', args=[self.object.pk,]) 
        form_class = PostUpdateForm
        template_name = "posts/update_post.html"
    
        def dispatch(self, request, *args, **kwargs):
            obj = self.get_object()
            if request.user.is_authenticated:
                if obj.author != self.request.user:
                    return redirect(obj)
                return super(UpdateStory, self).dispatch(request, *args, **kwargs)
            else:
                return redirect(obj)
    
    
        def get_success_url(self, **kwargs):         
            if  kwargs != None:
                return reverse_lazy('details', kwargs = {'pk': kwargs['idnumber']})
            else:
                return reverse_lazy('details', args = (self.object.id,))
    

    【讨论】:

    • 我不能建议进行编辑,所以: 1.LoginRequiredMixin 和 login_url 需要删除 2.在 get_success_url 中 else 语句的 reverse_lazy 对这个代码示例来说就足够了, 3.第二个 if 语句在调度中是不必要的,而是应该嵌套第一个带有 == 条件的 if 4.UpdateStory 需要更改为 PostUpdateView
    【解决方案2】:

    你试过包括

    from django.contrib.auth.decorators import login_required
    

    然后将这个装饰器放在你的类上方:

    @login_required 
    

    所以它是这样的

    
    @login_required 
    class PostUpdateView(UpdateView):
        model = Post
        login_url = reverse_lazy('details', args=[self.object.pk,]) 
        form_class = PostUpdateForm
        template_name = "posts/update_post.html"
    
    

    【讨论】:

    • @login_required 装饰器直接在函数中使用,在这里没有任何意义,在课堂上是使用 method_decorator 的最佳方式,所以请参考我的this 答案。
    【解决方案3】:
    class PostUpdateView(LoginRequiredMixin, UpdateView):
        model = Post
        form_class = PostUpdateForm
        template_name = "posts/update_post.html"
        redirect_field_name = None
        def get_login_url(self) -> str:
             object = self.get_object()
             return reverse_lazy('details', args=[object.pk,])
    

    你需要返回 网址

    【讨论】:

    • 这将返回一个“PostUpdateView”对象没有属性“对象”错误
    • 我编辑我的答案,现在应该可以了
    • 是的,但网址更改为http://127.0.0.1:8000/11/?next=/11/edit
    • 所以这个网址可以吗?
    • 我想我明白你的意思,你不想要 GET "next" 参数,对吧?我编辑我的答案,现在应该可以了
    猜你喜欢
    • 2014-02-03
    • 1970-01-01
    • 2020-02-22
    • 2016-10-01
    • 2016-08-08
    • 1970-01-01
    • 2021-12-09
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多