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

Django视图POST请求触发逻辑异常,登录流程跳转异常求助

问题分析与解决方案

问题1:点击“选项1”直接触发login_screen的POST分支

原因:从login_or_join视图返回login_screen(request)时,当前请求的method仍为POST(因为点击选项1是提交了一个POST表单),导致login_screen直接进入POST分支,尝试读取不存在的username和password,进而触发验证失败。

解决方法:不要直接返回login_screen(request),而是重定向到login_screen的路由,让浏览器发送GET请求加载登录页面:

def login_or_join(request):
    if request.method == "POST":
        option = request.POST.get("option")
        print('post request recieved')

        if option == "1":
            # 替换为你urls.py中login_screen对应的路由名称
            return redirect('login_screen')  
        if option == '2':
            # 同理,此处也建议重定向到in_game路由
            return redirect('in_game')  

    return render(request,"login_or_join.html")

问题2:登录失败无错误提示,提交后回到login_or_join视图

原因:登录页面表单未指定action属性,默认提交到login_or_join的URL,导致逻辑处理错误;同时验证失败时未向模板传递错误信息。

解决步骤:

  1. 修改登录页面表单的action,指向login_screen的路由:
    在login_page.html中调整表单代码:
<form method="POST" action="{% url 'login_screen' %}">
    {% csrf_token %}
    <input type="text" name="username" placeholder="用户名">
    <input type="password" name="password" placeholder="密码">
    <!-- 错误信息展示区域 -->
    {% if error %}
        <p style="color: red;">{{ error }}</p>
    {% endif %}
    <button type="submit">登录</button>
</form>
  1. 修改login_screen视图,传递错误信息:
    验证失败时将错误信息传入模板:
def login_screen(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        print(username)
        print(password)

        user = authenticate(request, username=username, password=password)
        print(user)

        if user is not None:
            return redirect('join_lobby')
        else:
            # 传递错误信息到模板
            return render(request,'login_page.html', {'error': '用户名或密码错误'})
    
    return render(request, 'login_page.html')

额外配置说明

确保你的urls.py已为login_screen配置正确路由,示例:

from django.urls import path
from . import views

urlpatterns = [
    path('login-or-join/', views.login_or_join, name='login_or_join'),
    path('login/', views.login_screen, name='login_screen'),
    # 其他路由...
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:53:21