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

使用ModelForm与LoginView搭建登录页遇报错及跳转问题

问题解决步骤

1. 修复 BaseModelForm.__init__() got an unexpected keyword argument 'request' 错误

Django的LoginView会将request对象传递给表单构造函数,但ModelForm不支持接收该参数。登录表单的作用是验证凭证而非创建/修改用户模型,因此禁止使用ModelForm,改用以下两种方案:

方案一:使用内置AuthenticationForm(推荐)

直接复用Django官方提供的登录表单,无需自定义:

from django.contrib.auth.views import LoginView
from django.contrib.auth.forms import AuthenticationForm

class Login(LoginView):
    form_class = AuthenticationForm  # 替换为内置表单
    template_name = 'account/login.html'

    def get_success_url(self):
        return reverse_lazy('account:home')

方案二:自定义登录表单

若需自定义字段样式,继承forms.Form而非ModelForm:

from django import forms

class LoginForm(forms.Form):
    username = forms.CharField(
        widget=forms.TextInput(attrs={'placeholder': 'Username', 'class': 'form-control'})
    )
    password = forms.CharField(
        widget=forms.PasswordInput(attrs={'placeholder': 'Password', 'class': 'form-control'})
    )

2. 修复页面始终停留在GET请求的问题

你的模板存在两个核心错误:

  • 表单action指向首页(account:home),导致POST请求未发送到登录处理视图。
  • 输入框缺少name属性,服务器无法接收表单数据。

修正后的模板代码

推荐使用表单渲染字段(自动生成正确的name和属性),同时修正action:

<form action="{% url 'account:login' %}" method="post">
    {% csrf_token %}
    <div class="input-group mb-3">
        {{ form.username }}
        <div class="input-group-append">
            <div class="input-group-text">
                <span class="fas fa-user"></span>
            </div>
        </div>
    </div>
    <div class="input-group mb-3">
        {{ form.password }}
        <div class="input-group-append">
            <div class="input-group-text">
                <span class="fas fa-lock"></span>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-12">
            <button type="submit" class="btn btn-primary btn-block btn-flat">Sign In</button>
        </div>
    </div>
</form>

若坚持手动编写输入框,必须添加name属性:

<input id="username" name="username" type="text" class="form-control" placeholder="Username">
<input id="password" name="password" type="password" class="form-control" placeholder="Password">

3. 解决浏览器不提示保存登录信息的问题

浏览器识别登录表单需满足:

  • 输入框name属性为username和password(上述两种表单方案已自动满足)。
  • 表单使用POST方法提交。
    使用表单渲染字段而非手动编写输入框,即可确保浏览器触发登录信息保存提示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:07:27