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/