Django中如何正确自定义密码重置邮件模板并传入uidb64、token参数
自定义Django密码重置邮件模板传值实现
内置的PasswordResetView在渲染邮件内容时,已经自动完成了所有必要上下文变量的注入,不需要额外编写视图逻辑传递uidb64、token等参数,自定义模板可以直接读取这些预置变量。
模板可直接使用的内置变量
Django默认注入到密码重置邮件模板的上下文包括:
user:发起密码重置请求的用户对象,可直接读取用户名、绑定邮箱等用户字段uid:经base64编码的用户唯一标识,也就是你提到的*uidb64*值token:系统生成的密码重置校验令牌- Django 3.0及以上版本额外提供
reset_url变量:已经拼接完成的完整可访问重置链接,自动适配当前站点域名、路由规则,不需要手动拼接参数
带自定义样式的模板示例
对应你配置的registration/password_reset_email.html文件,可以直接写为带内联样式(兼容邮件客户端)的模板:
<div style="max-width: 600px; margin: 0 auto; font-family: system-ui, sans-serif; padding: 20px;"> <h2 style="color: #222; border-bottom: 2px solid #2563eb; padding-bottom: 12px;"> 密码重置申请 </h2> <p>你好,{{ user.get_username }}:</p> <p> 我们收到了你针对绑定邮箱 <strong>{{ user.email }}</strong> 提交的密码重置请求, 请在有效期内完成后续操作: </p> <div style="margin: 32px 0; text-align: center;"> <a href="{{ reset_url }}" style="background-color: #2563eb; color: #fff; padding: 12px 28px; border-radius: 6px; text-decoration: none; font-weight: 500;" > 立即重置密码 </a> </div> <p style="color: #666; font-size: 12px; line-height: 1.6;"> 如果按钮无法点击,可直接复制以下链接到浏览器打开:<br> <span style="word-break: break-all;">{{ reset_url }}</span> </p> </div>
低版本Django适配
如果使用的Django版本低于3.0,上下文没有预置reset_url变量,可以直接读取已有的uid、token变量,结合模板标签自行拼接完整链接,不需要改动视图代码:
{% url 'password_reset_confirm' uidb64=uid token=token as reset_path %} <a href="{{ request.scheme }}://{{ request.get_host }}{{ reset_path }}"> 点击完成密码重置 </a>
这里的核心逻辑是:url模板标签支持直接读取上下文变量作为路由参数,把上下文里的uid映射到路由定义要求的uidb64参数,搭配请求对象里的域名信息,就能生成格式完全正确的访问链接。
注意事项
- 注意变量名映射:上下文里的编码用户ID变量名是
uid,传入路由参数时才需要对应到路由定义中的uidb64字段,不要混淆变量名 - 邮件样式尽量使用内联写法,主流邮件客户端会自动过滤
<style>标签、外部引入的CSS,避免样式不生效 - 重置链接的有效期不需要在模板中硬编码,直接修改项目
settings.py中的PASSWORD_RESET_TIMEOUT配置即可,内置校验逻辑会自动读取该配置值
内容的提问来源于stack exchange,提问作者Xfce4
相关产品推荐
相关产品推荐

