如何在Django Allauth自定义确认邮件中获取用户注册时的名字
解决方法:在Django Allauth确认邮件中调用用户注册时填写的姓名
不用完全重写整个确认邮件流程,只需要简单几步就能实现你的需求:
1. 确保自定义注册表单正确保存姓名到用户模型
首先,你已经有了收集姓名的自定义注册表单,关键要确保表单提交后,姓名被正确保存到用户对象中(比如默认的user.first_name字段,或者你自定义的字段)。举个示例,你的自定义表单可以这么写:
# 在你的app的forms.py中 from allauth.account.forms import SignupForm from django import forms class CustomSignupForm(SignupForm): # 添加姓名输入字段 first_name = forms.CharField(max_length=30, label="你的名字") def save(self, request): # 先调用父类方法创建用户 user = super().save(request) # 将表单中填写的姓名赋值给user的first_name字段 user.first_name = self.cleaned_data.get("first_name") user.save() return user
别忘了在settings.py里配置这个自定义表单,让allauth使用它:
ACCOUNT_FORMS = { 'signup': 'yourapp.forms.CustomSignupForm', }
2. 在重写的邮件模板中直接调用用户姓名
现在你已经重写了email_confirmation_message.txt模板,只需要直接用{{ user.first_name }}就能获取用户注册时填写的名字了。修改后的模板大概是这样:
{% load account %} {% load i18n %} {% autoescape off %} Dear {{ user.first_name }}, 感谢你注册我们的网站!请点击下面的链接激活你的账号: {{ activate_url }} 如果这不是你操作的,请忽略此邮件。 谢谢! {% endautoescape %}
额外情况:如果姓名存在自定义用户模型或Profile中
如果你的姓名字段不在默认User模型的first_name里,而是在自定义用户模型或者关联的Profile模型中,你可以这么做:
- 直接在模板中通过关联关系调用,比如
{{ user.profile.full_name }}(前提是模板上下文能拿到user对象) - 或者重写
AccountAdapter的send_confirmation_mail方法,添加额外的上下文变量:
# 在你的app的adapter.py中 from allauth.account.adapter import DefaultAccountAdapter class CustomAccountAdapter(DefaultAccountAdapter): def send_confirmation_mail(self, request, emailconfirmation, signup): # 获取默认上下文 ctx = self.get_email_confirmation_context(request, emailconfirmation, signup) # 添加用户的姓名到上下文(替换成你的实际字段路径) ctx['user_full_name'] = emailconfirmation.user.profile.full_name # 发送邮件 self.send_mail( 'account/email/email_confirmation_subject.txt', 'account/email/email_confirmation_message.txt', ctx, emailconfirmation.email_address.email, request=request, )
然后在settings.py配置这个适配器:
ACCOUNT_ADAPTER = 'yourapp.adapter.CustomAccountAdapter'
之后在模板里就可以用{{ user_full_name }}来调用姓名了。
总结一下,核心就是确保姓名被正确保存到用户相关的模型中,然后在邮件模板里直接调用对应的字段就行,不需要完全重写整个确认邮件逻辑。
内容的提问来源于stack exchange,提问作者Raf Rasenberg
相关产品推荐
相关产品推荐

