Django开发中点击登录按钮无法触发user_login视图执行的求助
导致登录按钮点击后无法触发user_login的核心原因
- 未在路由配置中注册user_login视图:当前
urls.py的urlpatterns列表仅注册了首页index的路由,Django无法根据请求路径匹配到user_login视图,请求自然无法触达对应函数。 - 表单action属性写法完全错误:模板中
action={{ views.user_login }}的写法不符合Django模板语法,模板引擎无法将视图对象直接解析为可访问的URL路径,最终渲染出来的action值是无效字符串,浏览器提交表单时无法发送到正确的服务端地址。 - 配套逻辑缺失:
user_login视图函数没有编写合法的响应返回逻辑,就算后续请求能正常到达视图,Django也会因为收到无效的视图返回值抛出报错;同时首页视图没有向模板传递form对象,模板中的{{ form.as_p }}属于无意义的冗余代码,不会起到实际作用。
分步修正方案
- 补全
urls.py的路由配置,将user_login视图注册到路由表中:from django.urls import path from iol_dash import views urlpatterns = [ path('', views.index, name='index'), # 新增user_login对应的路由,设置路由name方便模板反向解析 path('login/', views.user_login, name='user_login') ] - 修正
index.html中表单的action属性,使用Django内置的url模板标签反向解析路由地址,替换原来的错误写法:<!-- 错误写法:action={{ views.user_login }} --> <form class="modal-content animate" method="post" action="{% url 'user_login' %}"> {% csrf_token %} <!-- 删除无效的{{ form.as_p }},因为index视图没有传form对象到模板上下文 --> <div class="imgcontainer"> <span onclick="document.getElementById('id01').style.display='none'" class="close" title="Close Modal">×</span> </div> <div class="container"> <label for="username"><b>Username</b></label> <input type="text" placeholder="Enter Username" name="username" required> <label for="password"><b>Password</b></label> <input type="password" placeholder="Enter Password" name="password" required> <button type="submit">Login</button> </div> </form> - 补全
user_login视图的响应逻辑,添加必要的导入和返回值,避免请求到达后抛出视图无返回的错误:from django.shortcuts import render, redirect from iol import Service def index(request): return render(request, 'index.html', {}) def user_login(request): # 仅处理POST提交的登录请求 if request.method == "POST": username = request.POST.get('username') password = request.POST.get('password') service = Service() token = service.get_token( username=username, password=password ) print(token) # 登录处理完成后重定向回首页,保证视图返回合法响应 return redirect('index') # 如果是GET方式访问登录地址,直接重定向回首页 return redirect('index')
修正完成后,点击登录按钮时浏览器会将POST请求发送到
/login/路径,Django会匹配到对应路由,正常执行user_login函数的逻辑。
内容的提问来源于stack exchange,提问作者Martin Facts
相关产品推荐
相关产品推荐

