Django中发送含ID的用户邮箱链接,ID无法识别求助
解决Django邮件中ID链接无法识别的问题
问题核心在于模板未获取到实际ID参数,且硬编码URL格式错误,以下是具体修复步骤:
1. 传递ID到邮件模板
在views.py调用render_to_string时,必须将实际的id传入模板上下文,否则模板无法拿到动态ID值:
def demande_participer(request, id): participers = Mission.objects.get(id=id) benParticiper = request.user # 直接取当前用户,无需filter # 把ID作为上下文参数传给模板 template = render_to_string('Association/email_template.html', {'mission_id': id}) email = EmailMessage( 'Veuillez confirmer votre participation à la mission proposée', template, settings.EMAIL_HOST_USER, [request.user.email], ) email.fail_silently = False # 修复拼写错误:fail_silenty → fail_silently email.send()
2. 在模板中生成正确链接
不要硬编码URL,用Django的{% url %}标签生成符合路由规则的链接,避免格式错误:
{% load crispy_forms_tags %} {% block content %} Confirmé la Participation {# 通过url标签传入mission_id,生成正确链接 #} http://127.0.0.1:8000{% url 'demande_participer' mission_id %} {% endblock %}
更优方案:自动生成完整绝对URL
如果不想硬编码域名和端口,可在视图中用request.build_absolute_uri生成完整链接:
from django.urls import reverse def demande_participer(request, id): participers = Mission.objects.get(id=id) benParticiper = request.user # 生成带域名的完整确认链接 confirm_url = request.build_absolute_uri(reverse('demande_participer', args=[id])) template = render_to_string('Association/email_template.html', {'confirm_url': confirm_url}) # 后续邮件发送代码不变
模板中直接使用变量即可:
{% load crispy_forms_tags %} {% block content %} Confirmé la Participation {{ confirm_url }} {% endblock %}
额外提示
- 路由
<int:id>是位置参数,使用reverse时需用args=[id]传递;若路由用命名参数则传kwargs={'id': id} - 修复了邮件主题的拼写错误(
a la→à la,proposer→proposée),保证内容规范性
内容的提问来源于stack exchange,提问作者Othmane Boudali
相关产品推荐
相关产品推荐

