Django自定义MyUser登录视图实现:内置表单是否验证密码?
关于Django自定义用户模型的登录认证问题解答
嘿,我来帮你搞定这个登录认证的问题~
首先直接回答你的核心问题:内置的AuthenticationForm是具备密码校验能力的,但你的代码里有两个关键问题导致它没发挥作用,咱们一步步来修正:
1. 先修正你的CustomAuthenticationForm
默认的AuthenticationForm是为Django自带的User模型设计的,它默认期望的字段是username和password。而你的自定义用户模型用email作为唯一标识,所以需要调整表单:
- 你需要显式添加
password字段(登录肯定离不开密码校验) - 确保表单能正确识别
email作为认证的唯一标识字段
如果你的自定义用户模型已经设置了USERNAME_FIELD = 'email'(这是关键配置!),可以直接简化表单:
from django import forms from django.contrib.auth.forms import AuthenticationForm from .models import MyUser class CustomAuthenticationForm(AuthenticationForm): class Meta: model = MyUser fields = ('email', 'password')
如果还没设置USERNAME_FIELD,或者需要更自定义的校验逻辑,可以重写表单的clean方法:
from django import forms from django.contrib.auth.forms import AuthenticationForm from django.contrib.auth import authenticate from .models import MyUser class CustomAuthenticationForm(AuthenticationForm): email = forms.EmailField(label=_("Email Address")) password = forms.CharField(label=_("Password"), widget=forms.PasswordInput) class Meta: model = MyUser fields = ('email', 'password') def clean(self): email = self.cleaned_data.get('email') password = self.cleaned_data.get('password') if email and password: # 调用authenticate校验邮箱和密码的有效性 self.user_cache = authenticate(request=self.request, username=email, password=password) if self.user_cache is None: raise forms.ValidationError( _("请输入正确的邮箱和密码,注意区分大小写"), code='invalid_login', ) else: self.confirm_login_allowed(self.user_cache) return self.cleaned_data
2. 修正你的登录视图
你之前的视图有两个核心错误:
- 初始化
CustomAuthenticationForm时没有传入request作为第一个参数(AuthenticationForm的构造函数第一个参数必须是request) - 没必要手动调用
authenticate,表单通过is_valid()校验后,已经完成了凭证验证,直接拿用户即可
修正后的视图代码:
from django.shortcuts import render, redirect from django.contrib.auth import login as auth_login from .forms import CustomAuthenticationForm def login(request): if request.method == 'POST': # 注意第一个参数是request,第二个是POST请求数据 form = CustomAuthenticationForm(request, data=request.POST) if form.is_valid(): # 从表单获取已校验通过的用户对象 user = form.get_user() # 调用Django内置的login方法完成用户会话认证 auth_login(request, user) # 登录成功后跳转,这里替换成你想要的目标页面 return redirect('home') else: form = CustomAuthenticationForm(request) return render(request,'registration/loginn.html',{'form':form})
额外提醒
别忘了在settings.py里配置好自定义用户模型和认证后端:
# 指定自定义用户模型 AUTH_USER_MODEL = 'your_app.MyUser' # 默认认证后端即可支持基于USERNAME_FIELD的认证 AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
内容的提问来源于stack exchange,提问作者Наглый Спамер
相关产品推荐
相关产品推荐

