登录后未跳转至仪表盘,仍停留在登录页的问题排查
登录后无法跳转至仪表盘问题排查
问题现象
实现医生登录视图后,用户提交登录信息,页面仅刷新并回到清空字段的登录页,未跳转至仪表盘。已确认URL路径和表单POST方法设置无误。
代码片段
views.py
def doctor_login_view(request): if request.method == 'POST': form = DoctorLoginForm(request.POST) if form.is_valid(): email = form.cleaned_data.get('email') password = form.cleaned_data.get('password') user = authenticate(request, email=email, password=password) print(user) if user is not None: login(request, user) return redirect('doctor_dashboard') # Redirect to the doctors' dashboard else: form.add_error(None, 'Invalid email or password.') else: form = DoctorLoginForm() return render(request, 'doctor_login.html', {'form': form})
forms.py
class DoctorLoginForm(forms.Form): email = forms.EmailField(max_length=255) password = forms.CharField(widget=forms.PasswordInput)
urls.py
path('doctor/login/', views.doctor_login_view, name='doctor_login'),
登录模板(doctor_login.html)
{% extends 'base.html' %} {% block content %} <div class="container"> <h2>Doctor Login</h2> <form method="post" action="{% url 'doctor_login' %}"> {% csrf_token %} <!-- Login form fields --> <div class="form-group"> <label for="email">Email Address</label> <input type="email" class="form-control" id="email" name="email" required> </div> <div class="form-group"> <label for="password">Password</label> <input type="password" class="form-control" id="password" name="password" required> </div> <button type="submit" class="btn btn-primary">Login</button> </form> <p class="mt-3">Don't have an account? <a href="{% url 'doctor_registration' %}" class="btn btn-link">Register</a></p> </div> {% endblock %}
排查与解决步骤
检查用户认证是否成功
- 查看终端中
print(user)的输出:- 若输出
None,说明认证失败:- 核对用户邮箱和密码是否匹配;
- Django默认
authenticate方法用username而非email验证,需调整认证逻辑(见下方方案)。
- 若输出用户对象,说明认证成功但跳转失败:
- 检查
doctor_dashboard的URL配置,确保urls.py中存在name='doctor_dashboard'的路径; - 排查是否有权限中间件拦截已登录用户的请求。
- 检查
- 若输出
- 查看终端中
修复邮箱认证逻辑
- 方案一:修改自定义用户模型(需提前配置),将
USERNAME_FIELD设为email:class User(AbstractUser): USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username'] - 方案二:自定义认证后端,支持邮箱登录:
创建backends.py文件:
在from django.contrib.auth.backends import ModelBackend from django.contrib.auth import get_user_model class EmailBackend(ModelBackend): def authenticate(self, request, email=None, password=None, **kwargs): UserModel = get_user_model() try: user = UserModel.objects.get(email=email) except UserModel.DoesNotExist: return None else: if user.check_password(password): return user return Nonesettings.py中添加配置:AUTHENTICATION_BACKENDS = [ 'your_app_name.backends.EmailBackend', 'django.contrib.auth.backends.ModelBackend', ]
- 方案一:修改自定义用户模型(需提前配置),将
添加表单错误反馈
在模板的表单标签内添加错误提示,方便排查验证失败原因:{% if form.non_field_errors %} <div class="alert alert-danger"> {{ form.non_field_errors }} </div> {% endif %}确认跳转URL名称正确性
检查项目urls.py中是否存在对应路径,确保名称完全匹配:path('doctor/dashboard/', views.doctor_dashboard_view, name='doctor_dashboard'),
内容的提问来源于stack exchange,提问作者Murphy Elo
相关产品推荐
相关产品推荐

