如何让Django密码重置电子邮件漂亮的HTML?

Saq*_*Ali 9 django

我的Django应用程序目前设置为使用本机注册包来处理用户身份验证和管理.

我创建了一些文件myApp/templates/registration,用于发送密码重置令牌,如这些文档中所述.

它工作正常.除了密码重置电子邮件是一个丑陋的文本怪物.我想使它与我的应用程序发送的所有其他电子邮件的外观和感觉相匹配.IE:我希望它是HTML并包含图像,样式和链接.我怎么做?

我按照这里的详细说明.但是,该代码中存在错误,我不知道该怎么做:'CustomPasswordResetForm' object has no attribute 'users_cache'

有人能告诉我一个详细的工作示例如何实现这一目标吗?我希望不是那么难.

mal*_*vai 9

[交叉发布来自Django password_reset支持HTML电子邮件模板?]

经过一些试验和错误后,我发现了一种更简洁的方式来在最新版本的Django(1.8)中提供自定义模板化密码重置电子邮件.

在你的project/urls.py,添加这些导入:

from django.contrib.auth import views as auth_views
from django.core.urlresolvers import reverse_lazy
Run Code Online (Sandbox Code Playgroud)

并在通常的django contrib auth url route包含之前在urlpatterns中添加以下路由:

url(r'^accounts/password/reset/$',
  auth_views.password_reset,
  {
    'post_reset_redirect': reverse_lazy('auth_password_reset_done'),
    'html_email_template_name': 'registration/password_reset_html_email.html'
  },
  name='auth_password_reset'),


url('^', include('django.contrib.auth.urls')),
Run Code Online (Sandbox Code Playgroud)

然后,在您的应用程序的templates/registration文件夹中,password_reset_html_email.html使用您想要的任何HTML模板创建.

这似乎是必要的原因在于源django/contrib/auth/views.py,它具有原始URL路由映射到的视图函数:

147 def password_reset(request, is_admin_site=False,
148                    template_name='registration/password_reset_form.html',
149                    email_template_name='registration/password_reset_email.html',
150                    subject_template_name='registration/password_reset_subject.txt',
151                    password_reset_form=PasswordResetForm,
152                    token_generator=default_token_generator,
153                    post_reset_redirect=None,
154                    from_email=None,
155                    current_app=None,
156                    extra_context=None,
157                    html_email_template_name=None):
158
Run Code Online (Sandbox Code Playgroud)

html_email_template_name其设置None为默认值,除了为此情况重写此特定路由之外,似乎没有办法分配其值,如上所述.

希望这有助于无需复制粘贴一堆几乎完全相同的代码,如建议的其他一些答案 - 当然欢迎反馈!


Bur*_*lid 7

Django的认证,缺省助手的意见不能发送多部分(HTML)电子邮件,因为底层的send_mail方法不支持HTML电子邮件.

这将通过添加html_message标志在下一版本中修复.

解决此问题的最简单方法是创建自己的自定义密码重置表单,并用于EmailMultiAlternatives发送邮件,从而允许您的HTML在电子邮件客户端中正确呈现.

您可以使用现有表单进行更改:

class HTMLPasswordResetForm(forms.Form):
    email = forms.EmailField(label=_("Email"), max_length=254)

    def save(self, domain_override=None,
             subject_template_name='registration/password_reset_subject.txt',
             email_template_name='registration/password_reset_email.html',
             use_https=False, token_generator=default_token_generator,
             from_email=None, request=None):
        """
        Generates a one-use only link for resetting password and sends to the
        user.
        """
        # from django.core.mail import send_mail
        from django.core.mail import EmailMultiAlternatives
        UserModel = get_user_model()
        email = self.cleaned_data["email"]
        active_users = UserModel._default_manager.filter(
            email__iexact=email, is_active=True)
        for user in active_users:
            # Make sure that no email is sent to a user that actually has
            # a password marked as unusable
            if not user.has_usable_password():
                continue
            if not domain_override:
                current_site = get_current_site(request)
                site_name = current_site.name
                domain = current_site.domain
            else:
                site_name = domain = domain_override
            c = {
                'email': user.email,
                'domain': domain,
                'site_name': site_name,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'user': user,
                'token': token_generator.make_token(user),
                'protocol': 'https' if use_https else 'http',
            }
            subject = loader.render_to_string(subject_template_name, c)
            # Email subject *must not* contain newlines
            subject = ''.join(subject.splitlines())
            email = loader.render_to_string(email_template_name, c)

            msg = EmailMessage(subject, email, from_email, [user.email])
            msg.content_subtype = "html"  # Main content is now text/html
            msg.send()

            #send_mail(subject, email, from_email, [user.email])
Run Code Online (Sandbox Code Playgroud)

完成后,更改password_reset方法调用并传入新的表单类:

password_reset(request, password_reset_form=HTMLPasswordResetForm)
Run Code Online (Sandbox Code Playgroud)


小智 7

姜戈2

# add this import
from django.contrib.auth import views as auth_views

...

# add this path
path('accounts/password_reset/', auth_views.PasswordResetView.as_view(
    html_email_template_name='registration/password_reset_email.html'
)),
# just before
path('accounts/', include('django.contrib.auth.urls')),
Run Code Online (Sandbox Code Playgroud)


Dan*_*ong 6

我发现Django版本2.0的其他答案已经过时,因此添加了我的发现。

在2.0中,将URL添加到urls.py文件的正确方法是使用path()

from django.urls import path
from django.contrib.auth import views as auth_views

path('accounts/password_reset/', auth_views.PasswordResetView.as_view(
  html_email_template_name='registration/password_reset_html_email.html'
)),
Run Code Online (Sandbox Code Playgroud)

.as_view()函数是下一个要突出显示的代码段。Django 2.0将身份验证视图实现为类。您可以在身份验证视图文档中阅读有关此内容的更多信息。

然后,您可以使用`.as_view()将类“转换”为视图,并且可以将源代码中定义的任何类属性作为命名参数传递。

传入html_email_template_name(默认为None)会自动发送html电子邮件。

您可以通过以下python路径访问PasswordResetView的源代码:django.contrib.auth.views

在这里,您可以看到可以传递到PasswordResetView和其他身份验证视图中的其他类属性。这对于将extra_context传递到django模板中也是非常有用的。


小智 1

您是否尝试过编辑此模板?注册/password_reset_email.html

您可以将password_reset_email.html 文件添加到项目中的templates/registration 文件夹中,然后添加相关部分/HTML 以获得一个不错的模板。默认模板为空。