After some trial and error, I found a much simpler way to provide my own reset password pattern in the latest version of Django (1.8).
In project/urls.py add the following imports:
from django.contrib.auth import views as auth_views from django.core.urlresolvers import reverse_lazy
And add the following route to your urls before the usual inclusion of the django contrib url route:
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')),
And then in the application’s templates/registration folder, create password_reset_html_email.html with whatever HTML template you want.
The reason this seemed necessary is because of the source for django/contrib/auth/views.py , which has a view function for which the source URL maps to:
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
The html_email_template_name value html_email_template_name set to None by default, and there seemed to be no way to assign its value other than rewriting this particular route for this case, as I mentioned above.
Hope this helps without having to copy-paste a bunch of almost identical code, for example, some of the other suggested answers - feedback is welcome, of course!