Django中针对特定函数重写LOGIN_REDIRECT_URL的方法
解决Django特定页面注册/登录后跳转回原页面的问题
问题原因
你之前尝试通过request.session['LOGIN_REDIRECT_URL'] = url修改跳转地址但未生效,是因为这个变量是Django内置登录视图(如auth_views.LoginView)才会读取的全局配置,而你是在自定义的注册逻辑里处理登录,Django不会自动识别这个session变量来完成跳转,必须手动处理重定向逻辑。
可行解决方案
方案1:登录成功后直接手动重定向(最直接适配你的代码)
在自定义注册逻辑完成登录后,直接返回redirect响应跳转到目标页面,完全绕过全局的LOGIN_REDIRECT_URL配置。
修改你的show_venue函数代码:
from django.urls import reverse from django.shortcuts import render, redirect def show_venue(request, page_id): # 生成当前page_1的URL,比HTTP_REFERER更可靠 target_url = reverse('show_venue', args=[page_id]) # REGISTER USER FROM VENUE if request.method == "POST": form = RegisterForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.is_active=True user.save() user = authenticate(username = form.cleaned_data['username'], password = form.cleaned_data['password1'],) login(request,user) # 直接重定向到当前page_1页面 return redirect(target_url) else: for error in list(form.errors.values()): messages.error(request, error) else: form = RegisterForm() # 返回模板响应(补充你原代码可能缺失的部分) return render(request, 'your_template.html', {'form': form})
说明:
- 用
reverse生成当前页面的URL,比依赖HTTP_REFERER更可靠(HTTP_REFERER可能为空或被浏览器拦截) - 登录完成后直接返回
redirect,会立即跳转到目标页面,完全覆盖全局配置
方案2:利用next参数(更通用的表单场景)
如果你的注册表单是独立组件,可以在表单中添加隐藏的next字段传递当前页面地址,再在视图中读取该参数完成跳转:
- 在模板的注册表单中添加:
<form method="post"> {% csrf_token %} <!-- 其他表单字段 --> <input type="hidden" name="next" value="{{ request.path }}"> <button type="submit">注册</button> </form>
- 修改视图代码:
from django.urls import reverse from django.shortcuts import render, redirect def show_venue(request, page_id): if request.method == "POST": form = RegisterForm(request.POST) # 获取next参数,默认跳转到全局配置的index next_url = request.POST.get('next', reverse('index')) if form.is_valid(): user = form.save(commit=False) user.is_active=True user.save() user = authenticate(username = form.cleaned_data['username'], password = form.cleaned_data['password1'],) login(request,user) # 跳转到next指定的页面 return redirect(next_url) else: for error in list(form.errors.values()): messages.error(request, error) else: form = RegisterForm() return render(request, 'your_template.html', {'form': form})
总结
两种方案都能覆盖全局的LOGIN_REDIRECT_URL配置,实现从特定页面注册/登录后跳转回原页面的需求,其中方案1更适配你当前的代码结构,方案2更通用,适合多页面的登录/注册场景。
内容的提问来源于stack exchange,提问作者PhilM
相关产品推荐
相关产品推荐

