You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 "注册" %} &raquo;</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>

额外排查点

  1. 打开浏览器开发者工具,查看登录表单的action属性,确认其指向的是登录视图的URL。
  2. 检查是否有自定义JS代码干扰了表单的提交行为,比如阻止了默认提交事件或错误地触发了其他表单的提交。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:05:17