Django中login_required的redirect next跳转失效问题求助
解决Django login_required重定向原页面失效的问题
嘿,我仔细看了你的代码,问题主要出在登录表单没有传递next参数到POST请求上,另外还有几个小细节需要调整,下面一步步给你说:
核心问题分析
当用户访问需要登录的页面(比如dashboard)时,Django会自动跳转到你设置的LOGIN_URL,并在URL后面带上?next=目标页面URL的GET参数。你的登录视图在GET请求时确实拿到了这个next_url,但表单提交是POST请求——这时候request.GET.get('next')就拿不到值了,而且你也没把这个next值放到表单里,所以登录成功后next_url是空的,自然就跳转到默认的all_posts页面了。
具体修复步骤
1. 在登录视图中把next_url传递到模板
修改你的user_login视图,在渲染模板时把next_url传进去:
from django.contrib.auth.decorators import login_required def user_login(request): next_url = request.GET.get('next') print(next_url) if request.method == 'POST': form = UserLoginForm(request.POST) if form.is_valid(): cd = form.cleaned_data user = authenticate(request, username=cd['username'], password=cd['password']) if user is not None: login(request, user) messages.success(request, 'Login Successful', extra_tags='success') # 同时从GET和POST中获取next参数 next_url = request.GET.get('next') or request.POST.get('next') if next_url: return redirect(next_url) return redirect('post:all_posts') else: messages.error(request, 'Wrong Username Or Password', extra_tags='warning') else: form = UserLoginForm() # 把next_url传到模板上下文 return render(request, 'account/login.html', {'form': form, 'next_url': next_url})
2. 在登录模板中添加隐藏字段传递next
修改你的登录模板login.html,在表单里添加一个隐藏字段,把next_url传递到POST请求中:
{% extends 'base.html' %} {% block content %} <form action="." method="post"> {% csrf_token %} {{ form.as_p }} <!-- 添加隐藏字段传递next参数 --> {% if next_url %} <input type="hidden" name="next" value="{{ next_url }}"> {% endif %} <input type="submit" value="Login" class="btn btn-primary"> </form> {% endblock content %}
3. 修复URL配置的转义问题
注意到你的Account URL里写的是<int:user_id>,这是HTML转义后的字符,要改成Django URL的正确语法:
app_name = 'account' urlpatterns = [ path('login/', user_login, name='user_login'), path('register/', register, name='user_register'), path('logout/', user_logout, name='user_logout'), # 修正URL路径的语法 path('dashboard/<int:user_id>/', dashboard, name='user_dashboard'), ]
验证修复
做完这些修改后,你可以测试一下:
- 先退出登录,直接访问
/account/dashboard/你的用户ID/,会跳转到登录页,此时URL里应该带有?next=/account/dashboard/你的用户ID/ - 输入正确的账号密码登录,应该会直接跳转到dashboard页面,而不是默认的all_posts页面
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

