Django首页登录表单验证失败跳转至/accounts/login问题求助
解决首页登录表单错误时跳转默认登录页的问题
核心问题分析
- 视图中
AuthenticationForm的使用逻辑错误:它需要传入request作为第一个参数,且不能通过form.save()完成登录,必须用Django认证模块的login方法 - 表单
action指向了默认登录URL,导致验证失败时请求被提交到默认登录视图,而非首页视图
步骤1:修正views.py代码
from django.contrib.auth import login from django.contrib.auth.forms import AuthenticationForm from django.shortcuts import redirect, render def index(request): # 已登录用户直接返回首页(可选,避免重复显示登录表单) if request.user.is_authenticated: return render(request, 'home.html') if request.method == 'POST': # 必须传入request作为AuthenticationForm的第一个参数 form = AuthenticationForm(request, data=request.POST) if form.is_valid(): # 获取认证后的用户,执行登录操作 user = form.get_user() login(request, user) return redirect('home') # 用URL name跳转更规范 else: form = AuthenticationForm() # 验证失败时,表单会自动携带错误信息,直接渲染首页 return render(request, 'home.html', {'form': form})
步骤2:修正模板的表单action
把表单的action改为首页的URL,或者直接移除(默认提交到当前页面):
<!-- 方式1:用URL name指定首页 --> <form class="p-4 p-md-5 border rounded-3 bg-body-tertiary" action="{% url 'home' %}" method="post"> <!-- 方式2:移除action,默认提交到当前页面 --> <form class="p-4 p-md-5 border rounded-3 bg-body-tertiary" method="post">
额外优化(可选)
模板里的输入框可以直接用Django表单的渲染方式,减少手动编写的冗余和错误:
<!-- 替换手动写的input,用form字段自动渲染 --> <div class="form-floating mb-3"> {{ form.username }} <label for="{{ form.username.id_for_label }}">{{ form.username.label }}</label> </div> <div class="form-floating mb-3"> {{ form.password }} <label for="{{ form.password.id_for_label }}">{{ form.password.label }}</label> </div>
内容的提问来源于stack exchange,提问作者Tom Philpotts
相关产品推荐
相关产品推荐

