使用rest-auth注册无法发送确认邮件,触发AttributeError异常
嘿,我来帮你搞定这个头疼的错误!你遇到的AttributeError: module 'users' has no attribute 'get_full_name()',其实和模板用法、用户模型配置这两个关键点有关,咱们一步步拆解解决:
问题根源拆解
错误出在email_confirmation_message.txt模板第2行的{% user_display user.email as user_display %}代码上:
user_display是django-allauth提供的模板标签,它需要接收用户对象作为参数,但你传的是user.email(字符串类型),标签内部尝试调用对象的get_full_name()方法,自然会报错。- 另外请求里显示用户是
AnonymousUser,说明在发送确认邮件的环节,可能没有正确传递已创建的用户实例,或者你的自定义用户模型缺失了必要的方法。
具体解决方案
修正模板标签的用法
把模板第2行的代码改成正确的形式,直接传递用户对象:{% user_display user as user_display %}这样
user_display会自动调用用户对象的get_full_name()方法(如果存在),或者 fallback 到用户名/邮箱。确保自定义用户模型实现了
get_full_name()
如果你用了自己的users.User模型(不是Django默认的AbstractUser),一定要手动实现这个方法。比如在users/models.py里:from django.contrib.auth.models import AbstractBaseUser, BaseUserManager class User(AbstractBaseUser): # 你的自定义字段,比如email、first_name等 email = models.EmailField(unique=True) first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) # 其他必要配置... def get_full_name(self): # 可以根据你的需求返回,比如姓名组合或者邮箱 return f"{self.first_name} {self.last_name}" # 如果没有姓名字段,直接返回邮箱也可以:return self.email要是你继承的是
AbstractUser,这个方法默认已经存在,就不用额外写了。排查注册视图的用户传递逻辑
检查rest-auth/registration相关的视图配置,确保用户注册成功后,把有效的用户实例传递给邮件模板上下文,而不是匿名用户。比如自定义注册视图时,要确保创建用户后正确传入user变量。
小排查技巧
可以先在模板里加一行调试代码:
{{ user }} --- {{ user.__class__ }}
发送测试邮件后看看输出,确认传递的是不是真实的用户实例,而不是字符串或者AnonymousUser,这能帮你快速定位问题点。
内容的提问来源于stack exchange,提问作者Hemant Kumar Dixit

