使用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
相关产品推荐
相关产品推荐

