Django登录页面跳转报错求助:附代码与错误截图
Django登录页面跳转错误排查与解决
错误截图:
网页截图:
问题相关代码
登录页面HTML模板
<!DOCTYPE html> <!DOCTYPE html> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1> Signin</h1> <form action="/signin" method="post"> {% csrf_token %} <label for="">Username</label> <input type="text" id="username" name="username" placeholder="Enter your Username" required> <br> <label for="">Password</label> <input type="password" id="pass1" name="pass1" placeholder="Enter your Password" required> <br> <button type="submit">Sign in</button> </form> </body> </html>
视图函数
def signin(request): if request.method == "POST": username = request.POST["username"] pass1 = request.POST["pass1"] user = authenticate(username=username, password=pass1) if user is not None: login(request, user) fname = user.first_name return render(request, "authentication/index.html", {fname: "fame"}) else: messages.error(request, "Wrong Credentials") return redirect("home") return render(request, "authentication/signin.html")
URL配置
from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path("", views.home, name="home"), path("signup/", views.signup, name="signup"), path("signin/", views.signin, name="signin"), path("signout/", views.signout, name="signout"), ]
错误原因分析
- 上下文变量传递错误:视图中
return render(request, "authentication/index.html", {fname: "fame"})把变量名和值写反了,应该用模板可识别的字符串作为键,用户真实姓名作为值。当前写法会导致模板无法正确获取用户名,进而引发跳转后的页面渲染异常。 - 表单路径硬编码:HTML中
form action="/signin"使用硬编码路径,和URL配置里signin/的斜杠规则不匹配,可能触发路径匹配错误。 - HTML声明重复:模板开头重复三个
<!DOCTYPE html>,属于不规范写法,虽不直接引发错误,但需清理。
修复方案
1. 修正视图上下文传递
把视图中跳转代码改为:
return render(request, "authentication/index.html", {"fname": fname})
这样模板里就能通过{{ fname }}正确获取用户姓名。
2. 优化表单action路径
用Django URL反向解析替换硬编码,修改form标签:
<form action="{% url 'signin' %}" method="post">
该写法会自动匹配URL配置中的name值生成正确路径,避免后续URL修改时同步更改前端代码。
3. 清理重复HTML声明
删除模板开头重复的两个<!DOCTYPE html>,只保留一个。
4. 确保目标页面正确使用变量
在authentication/index.html中,用{{ fname }}渲染用户名,例如:
<h1>Welcome, {{ fname }}!</h1>
修正后完整代码
视图函数
def signin(request): if request.method == "POST": username = request.POST["username"] pass1 = request.POST["pass1"] user = authenticate(username=username, password=pass1) if user is not None: login(request, user) fname = user.first_name return render(request, "authentication/index.html", {"fname": fname}) else: messages.error(request, "Wrong Credentials") return redirect("home") return render(request, "authentication/signin.html")
登录HTML模板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <h1> Signin</h1> <form action="{% url 'signin' %}" method="post"> {% csrf_token %} <label for="username">Username</label> <input type="text" id="username" name="username" placeholder="Enter your Username" required> <br> <label for="pass1">Password</label> <input type="password" id="pass1" name="pass1" placeholder="Enter your Password" required> <br> <button type="submit">Sign in</button> </form> </body> </html>
内容的提问来源于stack exchange,提问作者Sanjan R
相关产品推荐
相关产品推荐

