Django手机号登录认证失败求助:手机号数据无法获取
问题分析与解决
你的问题核心是手机号格式不匹配,附带一处无效调试代码,具体修正点如下:
1. 移除无效调试语句
你在views.py中写了print(form.cleaned_data.get('phone_number')),但登录表单MyLoginForm里的手机号字段名叫phone而非phone_number,这条语句永远会输出None,直接删除即可。
2. 统一手机号格式匹配
表单的PhoneNumberField处理后,form.cleaned_data.get('phone')得到的是PhoneNumber对象,而数据库中phone_number字段存储的是E.164格式的字符串(如+8613800138000)。直接用对象调用authenticate会导致格式不匹配,必须将对象转换为对应格式的字符串。
修正后的views.py代码
from django.contrib.auth import authenticate, login, logout from django.shortcuts import render, redirect from .forms import MyLoginForm # Create your views here. def my_login(request): if request.method == 'POST': form = MyLoginForm(request, request.POST) if form.is_valid(): # 获取表单返回的PhoneNumber对象 phone_obj = form.cleaned_data.get('phone') # 转换为数据库存储的E.164格式字符串 phone_number = phone_obj.as_e164 password = form.cleaned_data.get('password') # 使用统一格式的手机号进行认证 user = authenticate(request, phone_number=phone_number, password=password) if user is not None: login(request, user) return redirect('home') else: form.add_error(None, '无效的手机号或密码。') else: form = MyLoginForm() return render(request, 'core/login.html', {'form': form})
额外检查项
- 确认
MyUserManager的create_user方法正确存储手机号为E.164格式,示例如下:def create_user(self, phone_number, password=None, **extra_fields): if not phone_number: raise ValueError('必须提供手机号') user = self.model(phone_number=phone_number, **extra_fields) user.set_password(password) user.save(using=self._db) return user - 确保前端模板中手机号输入框的
name属性为phone,与表单字段名一致。
内容的提问来源于stack exchange,提问作者Fhyruz
相关产品推荐
相关产品推荐

