将 Django URL 插入自定义电子邮件模板
Inserting a Django URL into a custom email template
我正在尝试在为我的网站制作的自定义模板中发送一封 Django 电子邮件。
但是,我无法让 Django URL link 正常工作。没有模板,我可以让 link 工作。用户名仅供参考。
有谁知道如何进行这项工作?
这是我的views.py:
#This code is in the view that sends the email
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', '<info@mysite.com>'
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 文件:
<h3>Hi <strong>{{ username }}</strong>,</h6>
<p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p>
<a href="http://domain{% url 'home' %}">Check Now</a>
这里是 email.txt:
Hi {{ username }},
disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:
http://domain{% url 'home' %}
不确定您的模板,但如果我没记错 Django urls,您可以在代码中使用 reverse
并通过上下文将已解析的 url 传递给您的模板。所以它会是这样的:
from django.core.mail import EmailMessage
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context
from django.urls import reverse
subject, from_email = 'subject', '<info@mysite.com>'
plaintext = get_template('email.txt')
htmly = get_template('email.html')
username = user.username
d = { 'username': username, 'url': reverse('home') }
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()
模板:
<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>
我认为您在电子邮件模板的 link 中缺少绝对值 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 电子邮件。
但是,我无法让 Django URL link 正常工作。没有模板,我可以让 link 工作。用户名仅供参考。
有谁知道如何进行这项工作?
这是我的views.py:
#This code is in the view that sends the email
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', '<info@mysite.com>'
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 文件:
<h3>Hi <strong>{{ username }}</strong>,</h6>
<p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p>
<a href="http://domain{% url 'home' %}">Check Now</a>
这里是 email.txt:
Hi {{ username }},
disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:
http://domain{% url 'home' %}
不确定您的模板,但如果我没记错 Django urls,您可以在代码中使用 reverse
并通过上下文将已解析的 url 传递给您的模板。所以它会是这样的:
from django.core.mail import EmailMessage
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context
from django.urls import reverse
subject, from_email = 'subject', '<info@mysite.com>'
plaintext = get_template('email.txt')
htmly = get_template('email.html')
username = user.username
d = { 'username': username, 'url': reverse('home') }
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()
模板:
<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>
我认为您在电子邮件模板的 link 中缺少绝对值 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)