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

Django登录成功后无法跳转至Products页面问题排查

问题分析与修复方案

你的核心问题是用户认证流程不兼容Django自带的认证系统,导致登录后无法通过@login_required校验,被重定向回登录页。以下是具体问题和修复步骤:

1. 注册逻辑错误:密码未哈希存储,且未创建Django认证用户

你自定义了UserRegister模型,但注册时直接存储明文密码,且没有创建Django认证系统认可的User实例。Django的authenticate函数只会校验哈希后的密码,且login函数依赖Django的用户模型来维护认证状态。

修复代码(修改SignUp视图):

from django.contrib.auth.models import User  # 导入Django自带User模型

def SignUp(request):
    if request.method == "POST":
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            # 使用Django自带方法创建用户,自动哈希密码
            user = User.objects.create_user(
                username=form.cleaned_data.get('username'),
                email=form.cleaned_data.get('email'),
                password=form.cleaned_data.get('password1')
            )
            # 可选:如果需要保留自定义UserRegister模型,关联已创建的User
            form_info = UserRegister(
                user=user,  # 需要在UserRegister模型中添加ForeignKey到User
                username=form.cleaned_data.get('username'),
                email=form.cleaned_data.get('email')
                # 不再存储明文密码
            )
            form_info.save()
            
            messages.success(request, 'Your account has been created!')
            login(request, user)  # 注册后直接登录用户
            return HttpResponseRedirect('/Products')
        else:
            print("Form is not valid")
            print(form.errors)
    else:
        form = UserRegisterForm()
    return render(request, 'SignUp.html', {'form': form})

注意:如果要保留UserRegister模型,需要给它添加一个关联Django User的外键字段:

from django.contrib.auth.models import User
class UserRegister(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    # 其他字段...

2. Login视图存在未导入函数调用

你在Login视图中使用了get_user(request),但没有导入该函数,会导致运行时错误。

修复代码:

在views.py顶部添加导入:

from django.contrib.auth import get_user

3. URLs中logout路由指向错误

你的URL配置中path('logout',views.logout,name='logout')调用的是Django自带的logout函数,而非你自定义的Logout视图(大写L)。

修复代码:

修改urls.py中的logout路由:

path('logout',views.Logout,name='logout')

4. Login模板未传递next参数到POST请求

当前模板中仅在form的action中携带next参数,但未作为POST字段传递,导致登录后可能无法正确获取next_url。

修复代码(修改login.html表单):

在表单内添加隐藏字段传递next参数:

{% csrf_token %}
<!-- 添加以下隐藏字段 -->
<input type="hidden" name="next" value="{{ next }}">
<div class="input-section">
    <!-- 原有表单内容 -->
</div>

额外建议:

  • 优先使用Django自带的用户认证系统,避免重复造轮子;若需自定义用户模型,需正确配置AUTH_USER_MODEL。
  • 检查UserLoginForm是否继承自django.contrib.auth.forms.AuthenticationForm,确保表单逻辑正确。

内容的提问来源于stack exchange,提问作者Hardik Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:58:11