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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:25:29