You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django send_mail添加跳转锚点点击报错问题求助

Django邮件跳转链接报错的解决方法

我在通过Django的send_mail发送邮件时,添加了跳转至请求详情页的链接,但点击链接时出现错误(错误截图:错误截图)。

我的邮件发送代码:

from django.core.mail import send_mail
from django.conf import settings
from django.template.loader import render_to_string

send_mail(
    subject='Request Rejected',
    message=f'Your request has been rejected by {self.request.user.username}.',
    from_email=settings.EMAIL_HOST_USER,
    recipient_list=[self.get_object().student.email],
    html_message=render_to_string('request/request_mail.html', {'content': f'Your request has been rejected by {self.request.user.username}.', 'obj':self.get_object()})
)

对应的request_mail.html模板代码:

<!DOCTYPE html>
<html lang="en">
    <head></head>
    <body>
        <p>{{ content }}</p>
        <a href="{% url 'request-detail' obj.id %}">Click here to view details of the request</a>
    </body>
</html>

问题原因

模板中使用{% url %}标签生成的是相对路径,邮件客户端无法识别这种路径(它不知道你的网站域名),因此点击时会出现无效链接错误。

解决办法:生成绝对URL

必须生成包含完整域名的绝对URL,以下是两种常用实现方式:

方式1:在视图中生成完整URL后传给模板

修改邮件发送代码,利用request.build_absolute_uri和reverse生成绝对URL,再传入模板:

from django.core.mail import send_mail
from django.conf import settings
from django.template.loader import render_to_string
from django.urls import reverse

# 生成带域名的绝对详情页URL
request_detail_url = self.request.build_absolute_uri(reverse('request-detail', args=[self.get_object().id]))

send_mail(
    subject='请求已被拒绝',
    message=f'你的请求已被{self.request.user.username}拒绝。',
    from_email=settings.EMAIL_HOST_USER,
    recipient_list=[self.get_object().student.email],
    html_message=render_to_string('request/request_mail.html', {
        'content': f'你的请求已被{self.request.user.username}拒绝。', 
        'request_detail_url': request_detail_url
    })
)

同步修改模板request_mail.html:

<!DOCTYPE html>
<html lang="zh-CN">
    <head></head>
    <body>
        <p>{{ content }}</p>
        <a href="{{ request_detail_url }}">点击查看请求详情</a>
    </body>
</html>

方式2:将request对象传入模板,在模板内生成绝对URL

如果不想在视图中处理URL,可以把request对象传入模板,直接在模板里拼接绝对路径:
修改邮件发送代码,添加request到上下文:

html_message=render_to_string('request/request_mail.html', {
    'content': f'你的请求已被{self.request.user.username}拒绝。', 
    'obj': self.get_object(),
    'request': self.request
})

修改模板代码:

<!DOCTYPE html>
<html lang="zh-CN">
    <head></head>
    <body>
        <p>{{ content }}</p>
        <a href="{{ request.build_absolute_uri(reverse('request-detail', args=[obj.id])) }}">点击查看请求详情</a>
    </body>
</html>

注:如果模板环境不支持直接调用reverse,可以先在视图中用reverse生成相对路径,再传入模板和request.build_absolute_uri拼接。


内容的提问来源于stack exchange,提问作者Raymond Li

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 13:57:33