Index: django/contrib/auth/views.py
===================================================================
--- django/contrib/auth/views.py	(revision 8471)
+++ django/contrib/auth/views.py	(working copy)
@@ -4,7 +4,7 @@
 from django.contrib.auth.forms import AuthenticationForm
 from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm, PasswordChangeForm
 from django.contrib.auth.tokens import default_token_generator
-from django.core.urlresolvers import reverse
+from django.core.urlresolvers import reverse, NoReverseMatch
 from django.shortcuts import render_to_response, get_object_or_404
 from django.contrib.sites.models import Site, RequestSite
 from django.http import HttpResponseRedirect, Http404
@@ -136,7 +136,13 @@
         form = PasswordChangeForm(request.user, request.POST)
         if form.is_valid():
             form.save()
-            return HttpResponseRedirect(reverse('django.contrib.auth.views.password_change_done'))
+            try:
+                return HttpResponseRedirect(reverse('django.contrib.auth.views.password_change_done'))
+            except NoReverseMatch:
+                # Admin interfaces don't hook contrib.auth urls into anything
+                # that reverse() can find, so we do something absurdly hackish
+                # here so we don't have to rewrite the entirety of admin.sites.root
+                return HttpResponseRedirect('done/')
     else:
         form = PasswordChangeForm(request.user)
     return render_to_response(template_name, {
