django-rest-auth搭配allauth使用CustomUser手机号作用户名报TypeError错误
错误产生原因
- 你自定义用户模型的
username字段使用了PhoneNumberField,该字段存储的是PhoneNumber类的实例,而非普通字符串类型。 - allauth在执行用户保存逻辑时,会默认调用
populate_username方法,对用户名字段做长度截断处理,代码中直接对字段值执行切片操作v[0:max_length],但PhoneNumber实例不支持切片操作,因此抛出该类型错误。 - 你传入的手机号字符串会被
PhoneNumberField自动转为PhoneNumber实例后绑定到用户对象上,所以allauth处理时拿到的不是原始字符串。
修复方案
推荐通过自定义allauth的账号适配器重写相关逻辑解决,步骤如下:
- 在你的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
- 在项目
settings.py中添加配置,指定使用自定义的适配器:
ACCOUNT_ADAPTER = "你的应用名称.adapter.CustomAccountAdapter"
如果需要保留allauth的用户名长度校验逻辑,只需要把上面populate_username方法里的注释打开,先将PhoneNumber实例转为字符串后再执行截断操作即可。
内容的提问来源于stack exchange,提问作者Russell
相关产品推荐
相关产品推荐

