You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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字段传递当前页面地址,再在视图中读取该参数完成跳转:

  1. 在模板的注册表单中添加:
<form method="post">
    {% csrf_token %}
    <!-- 其他表单字段 -->
    <input type="hidden" name="next" value="{{ request.path }}">
    <button type="submit">注册</button>
</form>
  1. 修改视图代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:34:54