Django路径问题:点击登录跳转至/login/login/而非根路径如何解决
问题根因
你遇到的路径拼接错误是因为表单使用了无开头斜杠的相对路径,浏览器会将该路径和当前页面路径拼接后发起请求,所以在/login/页面提交表单时就会请求/login/login/。
具体修改方案
1. 修正模板表单的action属性
login.html修改:
将原来的表单标签
<form action="login/" method="post">
改为使用站点绝对路径,或者更推荐的Django路由名称反查方式:
<!-- 方式1:绝对路径 --> <form action="/login/" method="post"> <!-- 方式2:路由反查(更易维护,后续改路由地址不用动模板) --> <form action="{% url 'login' %}" method="post">
signup.html同步修改:
同理,signup.html的表单也存在同样的相对路径问题,将
<form action="signup/" method="post">
改为:
<!-- 方式1:绝对路径 --> <form action="/signup/" method="post"> <!-- 方式2:路由反查 --> <form action="{% url 'signup' %}" method="post">
2. 修正urls.py重复命名问题
当前urls.py中根路径和/signup/路径都用了name='signup',属于不规范的重复命名,会导致路由匹配异常,修改为:
urlpatterns = [ path('',views.signup, name='home'), # 根路径改名为home path('signup/',views.signup,name='signup'), path('login/',views.login,name='login'), ]
3. 优化登录成功跳转逻辑
登录成功后要跳转根路径,views.py的login函数中修改redirect参数,避免空字符串的歧义:
if user is not None: auth.login(request,user) # 两种方式二选一 return redirect('/') # 直接跳根路径 # 或者用上面改的路由名 return redirect('home')
内容的提问来源于stack exchange,提问作者Saptarshee Sarkar
相关产品推荐
相关产品推荐

