встроенный в django password_reset изменить соединение с send_email - PullRequest
0 голосов
/ 29 октября 2018

В моем приложении я использую встроенные виды авторизации. Я также использую соединение почтовой марки с использованием django-anymail для некоторых пользовательских почтовых уведомлений.

Example: 

email_backend = get_connection('anymail.backends.postmark.EmailBackend')
   mail = EmailMessage(
   subject=subject,
   body=message,
   to=[settings.DEFAULT_FROM_EMAIL],
   connection=email_backend
   )

Я хочу изменить соединение, с которым я отправляю электронную почту в PasswordResetView. Есть ли способ, которым я могу дать аргумент ключевого слова в PasswordResetView.as_view () так же, как я даю html_email_template_name='...' или success_url='...'? или мне нужно переписать PasswordResetView?

1 Ответ

0 голосов
/ 29 октября 2018

Вам не нужно изменять PasswordResetView, но вам нужно будет создать пользовательский PasswordResetForm, который затем можно будет передать в качестве аргумента ключевого слова PasswordResetView.as_view().

Если вы посмотрите на исходный код PasswordResetView, вы увидите, что он на самом деле не отправляет само письмо. Отправка электронной почты выполняется как часть PasswordResetForm.save(), которая вызывает PasswordResetForm.send_mail()

Вы можете создать подкласс PasswordResetForm и перезаписать .send_mail(), чтобы использовать свой собственный почтовый сервер:

from django.contrib.auth.forms import PasswordResetForm

class PostmarkPasswordResetForm(PasswordResetForm):
    def send_mail(self, subject_template_name, email_template_name,
                  context, from_email, to_email, html_email_template_name=None):
        """
        Send a django.core.mail.EmailMultiAlternatives to `to_email` using
        `anymail.backends.postmark.EmailBackend`.
        """
        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_backend = get_connection('anymail.backends.postmark.EmailBackend')

        email_message = EmailMultiAlternatives(subject, body, from_email, [to_email], connection=email_backend)
        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()
...