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

Django框架登录异常:无报错但提交后无法跳转至首页

解决Django登录功能异常的问题

让我一步步帮你排查并修复这些问题:

1. 表单提交方式错误(核心问题)

你的login.html里的表单没有指定提交方法,默认会用GET请求,这就是为什么参数会直接显示在URL里,而且视图里的request.method == 'POST'分支永远不会触发。

修复login.html:

<form method="POST"> <!-- 必须加上method="POST" -->
    {% csrf_token %}
    {{form.as_p}}
    <input type="submit" value="Login">
</form>

2. 视图逻辑的严重错误

你的login_view里的验证逻辑完全写反了,还有拼写错误:

  • 当authenticate成功返回用户对象时(user is not None),才应该执行登录并跳转;你现在写的是if user is None才登录,逻辑完全搞反了。
  • 跳转的URL名称写错了:redirect('home url')应该是redirect('home_url'),要和你urls.py里的name='home_url'严格对应。
  • 表单验证失败时,你没有把带错误信息的表单返回给模板,用户看不到任何错误提示。

修复后的views.py:

from django.shortcuts import render,redirect
from .forms import LoginForm
from django.contrib.auth import authenticate,login

def home(request):
    return render(request,'home.html')

def login_view(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            uusername = form.cleaned_data.get('username')
            ppassword = form.cleaned_data.get('password')
            user = authenticate(request, username=uusername, password=ppassword)
            # 修正判断逻辑:验证成功才执行登录跳转
            if user is not None:
                login(request, user)
                return redirect('home_url')  # 修正URL名称的拼写错误
            else:
                print('用户名或密码错误')
                # 给表单添加全局错误提示
                form.add_error(None, '用户名或密码不正确')
        # 表单无效时,带着错误信息返回登录页
        return render(request,'login.html',{'form':form})
    else:
        form = LoginForm()
        return render(request,'login.html',{'form':form})

3. 自定义用户模型的隐藏坑

你自己定义了login_model,但Django的authenticate默认是验证自带的User模型(django.contrib.auth.models.User),所以就算你表单里的用户名密码正确,authenticate也会返回None——因为它找不到你的自定义用户。

如果坚持用自定义用户模型,需要在settings.py里添加配置(注意:必须在第一次数据库迁移前设置,否则需要重置数据库):

AUTH_USER_MODEL = '你的app名称.login_model'  # 替换成你的实际app名称

如果是学习阶段,更简单的方式是直接用Django自带的User模型,删掉自定义的login_model和LoginForm,改用官方的AuthenticationForm:

# 替换forms.py的内容
from django.contrib.auth.forms import AuthenticationForm

# 视图里直接使用AuthenticationForm
def login_view(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, data=request.POST)
        if form.is_valid():
            user = form.get_user()
            login(request, user)
            return redirect('home_url')
        return render(request,'login.html',{'form':form})
    else:
        form = AuthenticationForm()
        return render(request,'login.html',{'form':form})

4. 验证测试

修改完成后重启开发服务器,再尝试登录:

  • 表单会用POST提交,参数不会出现在URL里
  • 验证成功会跳转到首页,显示Hi admin
  • 验证失败会在登录页显示错误提示

内容的提问来源于stack exchange,提问作者Chidananda Nayak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:45:15