Django使用LoginRequiredMixin时如何实现登录后跳转至目标页面
解决方案
你遇到的问题本质是登录流程没有正确传递LoginRequiredMixin自动生成的next跳转参数,按以下步骤排查即可解决:
- 第一步:修改登录页模板,添加next隐藏字段
你的登录页表单内需要新增隐藏输入项,用来接收从受限页面跳转过来时携带的next参数,如果你用的是Django内置的登录视图,完成这一步即可生效:<form method="post" action="{% url 'login' %}"> {% csrf_token %} <!-- 保留原有用户名、密码输入框逻辑 --> <input type="hidden" name="next" value="{{ request.GET.next }}"> <button type="submit">登录</button> </form> - 第二步:自定义登录视图需补充next跳转逻辑
如果你没有使用Django内置的auth_views.LoginView,而是自己实现了登录视图,需要在登录验证成功后优先跳转next参数对应的地址,示例逻辑如下:from django.shortcuts import redirect, reverse def login_view(request): if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): # 保留原有用户校验、登录执行逻辑 # 优先级:POST参数next > GET参数next > 全局默认跳转地址 next_url = request.POST.get('next', request.GET.get('next', reverse('home'))) return redirect(next_url) # 保留原有其他逻辑 - 第三步:
TaskListView无需额外修改LoginRequiredMixin默认的redirect_field_name就是next,你不需要额外添加该属性,也不需要重写dispatch方法。前两步配置完成后,未登录用户访问/tasks/时会自动跳转到/login/?next=/tasks/,登录成功后就会直接跳转任务列表页,全局的LOGIN_REDIRECT_URL = 'home'也不需要修改,只会在无next参数的场景下生效。
内容的提问来源于stack exchange,提问作者Maaz Shaikh
相关产品推荐
相关产品推荐

