Django 在不包含静态文件(CSS 样式、图像)的情况下呈现 HTML 文件
Django renders the HTML file without including static files(CSS styles, images)
我尝试渲染 HTML 文件
html_message = get_template('mail.html').render(context=data)
email = EmailMultiAlternatives(
"Subject",
html_message,
settings.EMAIL_HOST_USER,
['example@gmail.com', ],
)
email.attach_alternative(html_message, 'text/html')
email.send(fail_silently=False)
HTML 文件
{% load static %}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
<link rel="stylesheet" href="{% static 'mail.css' %}">
</head>
<body>
<header>
<div>
<img class="logo" src="{% static 'logo.svg' %}" alt="">
</div>
</header>
</body>
结果 HTML 文件是在没有静态文件的情况下呈现的。
当我像视图一样渲染 HTML 时,一切都很好
问题是使用 static
生成的部分使用相对 url 静态资产(例如 /static/logo.svg
)。我认为这是预期的行为,并且由于 URL 不是绝对的(缺少主机名部分),因此电子邮件客户端无法正确获取它。
这也解释了为什么它适用于在线版本。
您可能会在这里找到好的线索:Django Get absolute url for static files
编辑:更准确地说,static
标签使用 STATIC_URL
设置生成资产路径,人们倾向于默认为 static/
。解决您的问题的一种方法是在此处设置绝对基数 url(即 https://your-hostname.com/static/
)
我尝试渲染 HTML 文件
html_message = get_template('mail.html').render(context=data)
email = EmailMultiAlternatives(
"Subject",
html_message,
settings.EMAIL_HOST_USER,
['example@gmail.com', ],
)
email.attach_alternative(html_message, 'text/html')
email.send(fail_silently=False)
HTML 文件
{% load static %}
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
<link rel="stylesheet" href="{% static 'mail.css' %}">
</head>
<body>
<header>
<div>
<img class="logo" src="{% static 'logo.svg' %}" alt="">
</div>
</header>
</body>
结果 HTML 文件是在没有静态文件的情况下呈现的。
当我像视图一样渲染 HTML 时,一切都很好
问题是使用 static
生成的部分使用相对 url 静态资产(例如 /static/logo.svg
)。我认为这是预期的行为,并且由于 URL 不是绝对的(缺少主机名部分),因此电子邮件客户端无法正确获取它。
这也解释了为什么它适用于在线版本。
您可能会在这里找到好的线索:Django Get absolute url for static files
编辑:更准确地说,static
标签使用 STATIC_URL
设置生成资产路径,人们倾向于默认为 static/
。解决您的问题的一种方法是在此处设置绝对基数 url(即 https://your-hostname.com/static/
)