Поддерживает ли Django password_reset HTML-шаблоны электронной почты? - PullRequest
7 голосов
/ 01 ноября 2011

Мне кажется, django поддерживает только обычные текстовые сообщения для писем для сброса пароля из коробки.Как я могу использовать шаблоны HTML для этой цели?

Ответы [ 8 ]

6 голосов
/ 24 сентября 2013

Вот как вы можете сделать переопределение:

urls.py

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

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)

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()
5 голосов
/ 01 ноября 2011

Вы можете переопределить save метод django.contrib.auth.forms.PasswordResetForm и передать новую форму в качестве аргумента в password_reset view.

1 голос
/ 09 марта 2018

Вы можете использовать PasswordResetSerializer http://django -rest-auth.readthedocs.io / ен / последний / configuration.html

Затем вы можете переопределить все параметры формы:

domain_override subject_template_name email_template_name use_https token_generator FROM_EMAIL запрос html_email_template_name extra_email_context

в моем случае я просто переопределяю 2 реквизита

class CustomPasswordResetSerializer(PasswordResetSerializer):

    def get_email_options(self):
        return {
            'domain_override': 'anydomain.com',
            'html_email_template_name': 'your_temp/password_reset_email.html',
        }
0 голосов
/ 18 июля 2018

После перезаписи PasswordResetForm и добавления этой строки кода после инициализации email_message я решаю свою проблему:

email_message.attach_alternative(body, 'text/html')
0 голосов
/ 11 июля 2018

Вот простой подход, сработавший для меня.Добавьте наш собственный путь к шаблону таким образом, чтобы он работал для меня.

path('users/password/reset/', password_reset, {'html_email_template_name': 'registration/password_reset_email.html'},name='password_reset'),

0 голосов
/ 15 декабря 2016

На основе решения Cem Kozinoglu я бы предложил изменить форму и перегрузить send_mail вместо метода сохранения следующим образом:

class CustomPasswordResetForm(PasswordResetForm):

    def send_mail(self, subject_template_name, email_template_name,
                  context, from_email, to_email, html_email_template_name=None):
        """
            Sends a django.core.mail.EmailMultiAlternatives to `to_email`.
        """
        subject = loader.render_to_string(subject_template_name, context)
        # Email subject *must not* contain newlines
        subject = ''.join(subject.splitlines())
        body = loader.render_to_string(email_template_name, context)

        email_message = EmailMultiAlternatives(subject, body, from_email, [to_email])
        # New line introduce
        email_message.attach_alternative(body, 'text/html')

        if html_email_template_name is not None:
            html_email = loader.render_to_string(html_email_template_name, context)
            email_message.attach_alternative(html_email, 'text/html')

        email_message.send()
0 голосов
/ 01 декабря 2015

Для меня исследование было трудоемким, но решение довольно тривиальным. Никаких переопределений, никаких манипуляций с формами или чем-то подобным Я использую Django == 1.8.6, но должен работать как минимум с django 1.7 и далее. Чтобы включить поддержку электронных писем в формате html в password_reset, все, что мне нужно было сделать, это изменить имя ключа шаблона электронной почты в функции сброса с email_template_name = 'emails / password_reset_email_html.html

до

HTML _email_template_name = 'электронная почта / password_reset_email_html.html',

Таким образом, функция сброса будет выглядеть так:

def reset(request):
# Wrap the built-in password reset view and pass it the arguments
# like the template name, email template name, subject template name
# and the url to redirect after the password reset is initiated.
return password_reset(request, template_name='profile/reset.html',
    html_email_template_name='emails/password_reset_email_html.html',
    subject_template_name='emails/reset_subject.txt',
    post_reset_redirect=reverse('success'))
0 голосов
/ 17 июня 2015

После некоторого количества проб и ошибок я обнаружил гораздо более краткий способ предоставления настраиваемого шаблонного электронного письма для сброса пароля в последней версии Django (1.8).

В вашем project/urls.py добавьте следующие импорты:

from django.contrib.auth import views as auth_views
from django.core.urlresolvers import reverse_lazy

и добавьте следующий маршрут в ваши urlpatterns перед включением обычного маршрута для аутентификации в django contrib:

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')),

И затем, в папке 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

html_email_template_name по умолчанию установлен на None, и, похоже, не было способа присвоить его значение, кроме переписывания этого конкретногомаршрут для этого случая, как я упоминал выше.

Надеюсь, это поможет без необходимости копировать и вставлять кучу практически идентичного кода, как некоторые из предложенных ответов - обратная связь приветствуется, конечно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...