我用 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”页面。在其他情况下,我仍然希望我的“登录”视图重定向到“主”。
好的。所以我通过将其添加到登录视图来解决它:
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/