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
相关产品推荐
相关产品推荐

