【问题标题】:password_reset email template doesn't render html tagpassword_reset 电子邮件模板不呈现 html 标记
【发布时间】:2020-09-18 23:33:37
【问题描述】:

我正在尝试使用一些 html 标签覆盖默认 password_reset_email.html 的内容,但它不起作用。这是我的修改。出于测试目的,我只是使用 p 标签。但我不工作。我完全不知道出了什么问题。

这是我的过程。

urls.py

path('accounts/', include('django.contrib.auth.urls')),

这是我的 html 模板

{% load i18n %}
{% autoescape on %}
{% blocktrans %}You're receiving this email because you requested a password reset for your user account at
{{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
<p>Hello world</p>
{% trans 'Your username, in case you’ve forgotten:' %} {{ user.get_username }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endautoescape %}

这是输出

【问题讨论】:

  • 您是否将其设置为电子邮件 html?还是原始文本?
  • 我是否需要更改其他内容,因为我使用的是 django 提供的默认 html 模板,该模板位于注册文件夹中。
  • 您可以显示您提交电子邮件的视图吗?
  • 这里我使用的是 django 提供的默认身份验证,django.contrib.auth.urls
  • edit您的问题。

标签: django


【解决方案1】:

email_template_name 是标准的,以 原始 文本发送,而不是 HTML。事实上,在PasswordResetView 我们看到:

class PasswordResetView(PasswordContextMixin, FormView):
    email_template_name = 'registration/password_reset_email.html'
    extra_email_context = None
    form_class = PasswordResetForm
    from_email = None
    html_email_template_name = None
    subject_template_name = 'registration/password_reset_subject.txt'
    success_url = reverse_lazy('password_reset_done')
    template_name = 'registration/password_reset_form.html'
    title = _('Password reset')
    token_generator = default_token_generator

    @method_decorator(csrf_protect)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def form_valid(self, form):
        opts = {
            'use_https': self.request.is_secure(),
            'token_generator': self.token_generator,
            'from_email': self.from_email,
            'email_template_name': self.email_template_name,
            'subject_template_name': self.subject_template_name,
            'request': self.request,
            'html_email_template_name': self.html_email_template_name,
            'extra_email_context': self.extra_email_context,
        }
        form.save(**opts)
        return super().form_valid(form)

如果您因此更改registration/password_reset_email.html,它仍会将电子邮件作为原始文本发送,因此电子邮件客户端会将其呈现为原始文本。

您可以做的只是创建一个优先的新路径,并在其中覆盖html_email_template_name

# urls.py

urlpatterns = [
    path('accounts/password_reset/',
        views.PasswordResetView.as_view(
            html_email_template_name='registration/password_reset_email.html'
        ),
        name='password_reset'
    ),
    path('accounts/', include('django.contrib.auth.urls')),
    # …
]

此路径出现在之前很重要,path 包括django.contrib.auth.urls,否则它仍将采用“旧”路径。

【讨论】:

  • 这个只渲染html,不渲染内部css和静态图片,但是它适用于内联css
  • @SandeepKushwaha:这很正常,因为静态 css 等没有随模板传递,而{% static ... %},只会渲染/path/to/file.css,而不是主机名,所以在这种情况下你需要使用{{ protocol }}://{{ domain }}{% static ... %}。此外,电子邮件客户端有时会阻止获取外部资源,因为这是一个隐私问题。毕竟,可以用它来查明用户是否阅读了邮件。
  • 它也不适用于内部 css,我的意思是 css 和 html 在同一页面中。我也试过这个{{ protocol }}://{{ domain }}{% static ... %},但我仍然面临同样的图像问题。这里我使用自己的邮件服务器发送电子邮件。
  • @SandeepKushwaha:电子邮件 server 不是问题。需要做这项工作的是客户。您只需发送一封电子邮件,说明它是 html,然后是 HTML 页面。但是大多数电子邮件客户端在获取外部资源方面非常严格。例如,我将我的电子邮件客户端配置为拒绝所有外部资源,如果电子邮件中没有原始文本部分,甚至不呈现电子邮件。
  • 试图用内联svg替换外部svg图标,然后渲染所有svg代码而不是显示图像
【解决方案2】:

这只是要添加的 5 个字母,并且砰..!!你的工作会完成的。

改变---

urls.py

patterns = [
path('accounts/password_reset/',
    views.PasswordResetView.as_view(
        email_template_name='registration/password_reset_email.html'
    ),
    name='password_reset'
),
path('accounts/', include('django.contrib.auth.urls')),
# …]

到--

patterns = [
path('accounts/password_reset/',
    views.PasswordResetView.as_view(
        html_email_template_name='registration/password_reset_email.html'
    ),
    name='password_reset'
),
path('accounts/', include('django.contrib.auth.urls')),
# …]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2022-01-20
    • 1970-01-01
    • 2012-11-28
    • 2020-01-14
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多