Django password_reset是否支持HTML电子邮件模板?

Ser*_*rov 7 python django

在我看来,django只支持纯文本消息,用于密码重置电子邮件的开箱即用.我如何为此目的使用html模板?

Cem*_*glu 6

以下是您可以执行覆盖的方法:

urls.py

url(r'^user/password/reset/$', 
    'YOUR_APP.views.password_reset', 
    {'post_reset_redirect' : '/#/login?resetemail=true'},
    name="password_reset"),
Run Code Online (Sandbox Code Playgroud)

views.py

from django.contrib.auth.views import password_reset as django_password_reset
from YOUR_APP.forms import CustomPasswordResetForm

def password_reset(*args, **kwargs):
    """
        Overriding the Email Password Resert Forms Save to be able to send HTML email
    """
    kwargs['password_reset_form'] = CustomPasswordResetForm
    return django_password_reset(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

form.py

from django.contrib.auth.forms import PasswordResetForm
from django.contrib.auth.tokens import default_token_generator

class CustomPasswordResetForm(PasswordResetForm):
    """
        Overriding the Email Password Resert Forms Save to be able to send HTML email
    """
    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html',
             use_https=False, token_generator=default_token_generator, request=None, email_subject_name='registration/password_reset_subject.txt', **kwargs):
        from django.core.mail import EmailMultiAlternatives
        from django.utils.html import strip_tags
        from django.template.loader import render_to_string
        from django.contrib.sites.models import get_current_site
        from django.utils.http import int_to_base36

        for user in self.users_cache:
            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': int_to_base36(user.id),
                'user': user,
                'token': token_generator.make_token(user),
                'protocol': use_https and 'https' or 'http',
            }
            render = render_to_string(email_template_name, c)
            render_subject = render_to_string(email_subject_name, c)

            msg = EmailMultiAlternatives(render_subject, strip_tags(render), None, [user.email])
            msg.attach_alternative(render, "text/html")
            msg.send()
Run Code Online (Sandbox Code Playgroud)

  • 我收到此错误:/ user/password/reset /'CustomPasswordResetForm'对象中的AttributeError没有属性'users_cache'.你弄错了吗?我应该使用其他功能而不是users_cache()吗?其他人做了什么. (3认同)

DrT*_*rsa 5

您可以覆盖save方法django.contrib.auth.forms.PasswordResetForm并将新表单作为参数传递给password_reset视图.