将Django的URL插入自定义的电子邮件模板。
将Django的URL插入自定义的电子邮件模板。
我试图在我网站的自定义模板中发送Django邮件。然而,我无法正确地使Django的URL链接工作。在没有模板的情况下,我可以使链接工作。用户名可用于引用。有人知道如何让这个工作吗?
这是我的views.py代码:
# 这段代码在发送邮件的视图中 from django.core.mail import EmailMessage from django.core.mail import EmailMultiAlternatives from django.template.loader import get_template from django.template import Context subject, from_email = 'subject', '' plaintext = get_template('email.txt') htmly = get_template('email.html') username = user.username d = { 'username': username } text_content = plaintext.render(d) html_content = htmly.render(d) msg = EmailMultiAlternatives(subject, text_content, from_email, [user.email]) msg.attach_alternative(html_content, "text/html") msg.send()
这个设置是基于这个回答:Creating email templates with Django
这里是email.html文件:
Hi {{ username }}, disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link: Check Now
这里是email.txt:
Hi {{ username }}, disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link: http://domain{% url 'home' %}
问题:在自定义的电子邮件模板中插入Django URL的问题。
原因:您在电子邮件模板中的链接中缺少绝对URL。当您发送电子邮件时,Django会使用相对URL填充URL,而您的Gmail邮件客户端可能会使用其自己的域和语言前缀路径填充URL。
解决方法:您需要在Django模板中添加当前站点的域名。链接的<a>
标签应如下所示:
<a href="{{ request.scheme }}://{{ request.get_host }}{% url 'home' %}">Check Now</a>
要为电子邮件渲染模板,这是您可能需要主机值的情况之一:
from django.template.loader import render_to_string def view(request): ... email_body = render_to_string( 'template.txt', context, request=request)
问题的原因是在自定义的电子邮件模板中插入Django URL时遇到困难。解决方法是使用Django的reverse
函数在代码中生成解析后的URL,并通过上下文将其传递到模板中。
具体的解决方法如下:
1. 导入必要的模块:导入django.core.mail
中的EmailMessage
和EmailMultiAlternatives
类,导入django.template.loader
中的get_template
函数,导入django.template
中的Context
类,导入django.urls
中的reverse
函数。
2. 设置电子邮件的主题和发件人。
3. 使用get_template
函数获取纯文本和HTML格式的电子邮件模板。
4. 获取用户的用户名,并将其作为一个变量存储在字典d
中,同时使用reverse
函数获取解析后的URL,并将其也存储在字典d
中。
5. 使用render
方法渲染纯文本和HTML格式的电子邮件内容。
6. 创建EmailMultiAlternatives
对象,并将主题、纯文本内容、发件人和收件人作为参数传递。
7. 使用attach_alternative
方法将HTML格式的内容添加到电子邮件中。
8. 使用send
方法发送电子邮件。
模板的内容如下:
<h3>Hi <strong>{{ username }}</strong>,</h6> <p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p> <a href="http://domain{{ url }}">Check Now</a>
文章结束,接下来将尝试这个解决方法,如果有效会告诉你。