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

django-rest-auth搭配allauth使用CustomUser手机号作用户名报TypeError错误

错误产生原因
  • 你自定义用户模型的username字段使用了PhoneNumberField,该字段存储的是PhoneNumber类的实例,而非普通字符串类型。
  • allauth在执行用户保存逻辑时,会默认调用populate_username方法,对用户名字段做长度截断处理,代码中直接对字段值执行切片操作v[0:max_length],但PhoneNumber实例不支持切片操作,因此抛出该类型错误。
  • 你传入的手机号字符串会被PhoneNumberField自动转为PhoneNumber实例后绑定到用户对象上,所以allauth处理时拿到的不是原始字符串。
修复方案

推荐通过自定义allauth的账号适配器重写相关逻辑解决,步骤如下:

  1. 在你的Django应用下新建adapter.py文件,添加以下代码:
from allauth.account.adapter import DefaultAccountAdapter

class CustomAccountAdapter(DefaultAccountAdapter):
    def populate_username(self, request, user):
        # 注册时已主动传入合法的手机号作为username,无需allauth自动填充/截断
        # 若需要保留截断逻辑,可先转为字符串再处理:user.username = str(user.username)[:self.username_max_length]
        pass
  1. 在项目settings.py中添加配置,指定使用自定义的适配器:
ACCOUNT_ADAPTER = "你的应用名称.adapter.CustomAccountAdapter"

如果需要保留allauth的用户名长度校验逻辑,只需要把上面populate_username方法里的注释打开,先将PhoneNumber实例转为字符串后再执行截断操作即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:15:02