Как отправить письмо о сбросе пароля в html-стиле с помощью django

Я создал html-стилизованную версию письма для сброса пароля, которая должна быть установлена с помощью django, расположенную по адресу 'registration/html_password_reset_email.html'. Из других стековерсий я узнал, что мне нужно добавить параметр html_email_template_name для html-версии отправляемого письма. Однако даже с приведенным ниже кодом отправляется только текстовая версия файла ('registration/password_reset_email.html'). Подскажите, что я делаю неправильно?

from django.contrib import admin
from django.urls import include, path
from django.contrib.auth import views as auth_views
from django.views.generic.base import RedirectView
from django.urls import reverse

from . import views

urlpatterns = [
    path('', views.homeview, name="homeview"),
    path('dashboard/', include('dashboard.urls')),
    path('admin/', admin.site.urls),
    path('accounts/', include('django.contrib.auth.urls')),
    path("register/", views.register_request, name="register"),

    path('reset_password/', auth_views.PasswordResetView.as_view(
            template_name='registration/password_reset_form.html',
            html_email_template_name='registration/html_password_reset_email.html',
            email_template_name='registration/password_reset_email.html',  
        ), name="reset_password"), # Submit email form
    path('reset_password_sent/', auth_views.PasswordResetDoneView.as_view(), name="password_reset_done"), # Email sent success message
    path('reset/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(), name="password_reset_confirm"), # Link to password reset form in email
    path('reset_password_complete/', auth_views.PasswordResetCompleteView.as_view(), name="password_reset_complete"), # Password successfully changed message
]

Вы назвали свой URL reset_password, а имя, используемое Django, - password_reset. Вы должны использовать то же имя, поскольку Django будет вызывать его с помощью reverse('reset_password'):

urlpatterns = [
    ...,
    path('accounts/', include('django.contrib.auth.urls')),
    ...,
    path('reset_password/', auth_views.PasswordResetView.as_view(
            template_name='registration/password_reset_form.html',
            html_email_template_name='registration/html_password_reset_email.html',
            email_template_name='registration/password_reset_email.html',  
        ), name="password_reset"), # <-
    ...,
]

Кроме того, остерегайтесь сохранять этот шаблон URL после path('accounts/', include('django.contrib.auth.urls')), так как имена URL будут конфликтовать, а последний имеет приоритет .

При именовании шаблонов URL выбирайте имена, которые вряд ли будут конфликтовать с именами, выбранными другими приложениями. Если вы вызовете комментарий к вашему шаблону URL, а другое приложение сделает то же самое, то URL, который найдет reverse(), будет зависеть от того шаблона, который стоит последним в списке urlpatterns вашего проекта.

Вернуться на верх