为什么LoginPemissionMixin会重定向到错误的url

问题描述 投票:0回答:1

我用 Django 制作我的项目。 我想让只有登录的用户才能访问 URL。 当我的类使用 LoginRequiredMixin 重定向到登录视图时,成功登录后它会重定向到 URL“main”。

views.py

class LoginView(FormView):
    form_class = LoginForm
    template_name = "tavern_app/login.html"
    success_url = reverse_lazy("main")

    def form_valid(self, form):
        user = form.user
        login(self.request, user)
        return super().form_valid(form)


class CreateSessionBaseView(LoginRequiredMixin, View):
    login_url = '/log-in/'

    def get(self, request):

        return render(request, "tavern_app/create_session_base.html")

url.py

    path("log-in/", LoginView.as_view(), name="login"),
    path("create-session/", CreateSessionBaseView.as_view(), name="create-session-base"),

此时,当我以未登录用户身份输入 CreateSessionBaseView 时,它会重定向到使用 URL 登录:

http://127.0.0.1:8000/log-in/?next=/create-session/

但是成功登录后,它会重定向到 LoginView 中定义的“main”。

我尝试用redirect_field_name来处理它:

class CreateSessionBaseView(LoginRequiredMixin, View):
    login_url = 'login'
    redirect_field_name = 'redirect_to'

    def get(self, request):

        return render(request, "tavern_app/create_session_base.html")

它将 URL 更改为

http://127.0.0.1:8000/log-in/?redirect_to=/create-session/

但看来 LoginView 的 success_url 仍然获胜。

如何将其重定向回我的“create-session-base”页面。在其他情况下,我仍然希望我的“登录”视图重定向到“主”。

django mixins
1个回答
0
投票

好的。所以我通过将其添加到登录视图来解决它:

redirect_to = self.request.GET.get('next', None)
        if redirect_to:
            return HttpResponseRedirect(redirect_to)
        else:
            return HttpResponseRedirect(reverse_lazy("main"))

现在看起来像这样

class LoginView(FormView):
    form_class = LoginForm
    template_name = "tavern_app/login.html"
    success_url = reverse_lazy("main")

    def form_valid(self, form):
        user = form.user
        login(self.request, user)

        redirect_to = self.request.GET.get('next', None)
        if redirect_to:
            return HttpResponseRedirect(redirect_to)
        else:
            return HttpResponseRedirect(reverse_lazy("main"))

        return super().form_valid(form)


class CreateSessionBaseView(LoginRequiredMixin, View):
    login_url = 'login'

    def get(self, request):

        return render(request, "tavern_app/create_session_base.html")

现在如果 URL 地址有 ?next ,它会重定向到右侧视图。就像这里:

http://127.0.0.1:8000/log-in/?next=/create-session/

在其他情况下,它会重定向到“main”,如下所示:

http://127.0.0.1:8000/log-in/
© www.soinside.com 2019 - 2024. All rights reserved.