LoginRequiredMixin是否允许在同一页面使用两个表单?
问题分析与解决方案
首先明确:LoginRequiredMixin和你遇到的问题完全无关。这个Mixin的作用仅仅是限制未登录用户访问特定视图,会自动将未登录用户重定向到登录页面,和表单的渲染、提交路径没有任何关系。
你当前的核心问题是登录表单提交时跳转到了注册页面,大概率是以下原因之一:
1. 表单action属性解析错误
检查模板中{% url 'account_login' %}是否正确生成了登录视图的URL。可以通过浏览器开发者工具查看登录表单的action属性值,如果它是空或者指向了注册页面的URL,说明URL反向解析失败——可能是urls.py中没有正确配置account_login的路由(不过cookie-cutter集成的django-allauth通常已经配置好了),或者你拼写错了路由名称。
2. 前端切换逻辑的干扰
你模板中的checkbox用于切换登录/注册表单的显示,可能是CSS或JS逻辑错误,导致实际提交的是注册表单而非登录表单。比如,两个表单的z-index层级问题,或者JS事件绑定错误,让登录按钮触发了注册表单的提交。
实现同一页面双表单的正确方式
完全可以在同一页面放置登录和注册表单,无需依赖LoginRequiredMixin,具体步骤如下:
步骤1:创建一个独立的视图
这个视图负责同时提供登录和注册表单实例,传给模板:
from django.views.generic import TemplateView from allauth.account.forms import LoginForm, SignupForm class CombinedAuthView(TemplateView): template_name = 'combined_auth.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 实例化两个表单 context['login_form'] = LoginForm() context['signup_form'] = SignupForm() # 处理重定向字段,和allauth的逻辑保持一致 context['redirect_field_name'] = 'next' context['redirect_field_value'] = self.request.GET.get('next', '') return context
步骤2:配置路由
在项目的urls.py中添加这个视图的路由:
path('auth/', CombinedAuthView.as_view(), name='combined_auth'),
步骤3:修改模板代码
分别使用{{ login_form }}和{{ signup_form }}渲染两个表单,确保各自的action指向正确的视图:
<div class="forms"> <input type="checkbox" id="chk" aria-hidden="true"> <div class="signup"> <form id="signup_form" method="post" action="{% url 'account_signup' %}"> {% csrf_token %} <label class="signup-label" for="chk" aria-hidden="true">注册</label> {{ signup_form }} {% if redirect_field_value %} <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" /> {% endif %} <button class="btn btn-primary" type="submit">{% trans "注册" %} »</button> </form> </div> <div class="login-form"> <form class="login" method="POST" action="{% url 'account_login' %}"> {% csrf_token %} <label class="login-label" for="chk" aria-hidden="true">登录</label> {{ login_form }} {% if redirect_field_value %} <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}" /> {% endif %} <a class="button secondaryAction" href="{% url 'account_reset_password' %}" style="margin-left:110px">{% trans "忘记密码?" %}</a> <button class="primaryAction btn btn-primary" type="submit">{% trans "登录" %}</button> </form> </div> </div>
额外排查点
- 打开浏览器开发者工具,查看登录表单的action属性,确认其指向的是登录视图的URL。
- 检查是否有自定义JS代码干扰了表单的提交行为,比如阻止了默认提交事件或错误地触发了其他表单的提交。
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

