django встроенный password_reset изменить соединение с send_email
В моем приложении я использую встроенные виды авторизации. Я также использую соединение почтовых штемпелей, используя 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 ответ
Вам не нужно менять 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()