diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index e25a4d4..0a675ec 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -785,7 +785,7 @@ class ModelAdmin(BaseModelAdmin):
             "admin/change_form.html"
         ], context, current_app=self.admin_site.name)
 
-    def response_add(self, request, obj, post_url_continue='../%s/'):
+    def response_add(self, request, obj, post_url_continue=None):
         """
         Determines the HttpResponse for the add_view stage.
         """
@@ -797,9 +797,14 @@ class ModelAdmin(BaseModelAdmin):
         # the presence of keys in request.POST.
         if "_continue" in request.POST:
             self.message_user(request, msg + ' ' + _("You may edit it again below."))
-            if "_popup" in request.POST:
-                post_url_continue += "?_popup=1"
-            return HttpResponseRedirect(post_url_continue % pk_value)
+            if post_url_continue is None:
+                post_url_continue = reverse('admin:%s_%s_change' %
+                                            (opts.app_label, opts.module_name),
+                                            args=(pk_value,),
+                                            current_app=self.admin_site.name)
+                if "_popup" in request.POST:
+                    post_url_continue += "?_popup=1"
+            return HttpResponseRedirect(post_url_continue)
 
         if "_popup" in request.POST:
             return HttpResponse(
@@ -812,18 +817,7 @@ class ModelAdmin(BaseModelAdmin):
             return HttpResponseRedirect(request.path)
         else:
             self.message_user(request, msg)
-
-            # Figure out where to redirect. If the user has change permission,
-            # redirect to the change-list page for this object. Otherwise,
-            # redirect to the admin index.
-            if self.has_change_permission(request, None):
-                post_url = reverse('admin:%s_%s_changelist' %
-                                   (opts.app_label, opts.module_name),
-                                   current_app=self.admin_site.name)
-            else:
-                post_url = reverse('admin:index',
-                                   current_app=self.admin_site.name)
-            return HttpResponseRedirect(post_url)
+            return self.response_post_save(request, obj)
 
     def response_change(self, request, obj):
         """
@@ -863,17 +857,28 @@ class ModelAdmin(BaseModelAdmin):
                                         current_app=self.admin_site.name))
         else:
             self.message_user(request, msg)
-            # Figure out where to redirect. If the user has change permission,
-            # redirect to the change-list page for this object. Otherwise,
-            # redirect to the admin index.
-            if self.has_change_permission(request, None):
-                post_url = reverse('admin:%s_%s_changelist' %
-                                   (opts.app_label, module_name),
-                                   current_app=self.admin_site.name)
-            else:
-                post_url = reverse('admin:index',
-                                   current_app=self.admin_site.name)
-            return HttpResponseRedirect(post_url)
+            return self.response_post_save(request, obj)
+
+    def response_post_save(self, request, obj):
+        """
+        Figure out where to redirect after the 'Save' button has been pressed.
+        If the user has change permission, redirect to the change-list page for
+        this object. Otherwise, redirect to the admin index.
+        """
+        opts = obj._meta
+        if obj._deferred:
+            opts_ = opts.proxy_for_model._meta
+            module_name = opts_.module_name
+        else:
+            module_name = opts.module_name
+        if self.has_change_permission(request, None):
+            post_url = reverse('admin:%s_%s_changelist' %
+                               (opts.app_label, module_name),
+                               current_app=self.admin_site.name)
+        else:
+            post_url = reverse('admin:index',
+                               current_app=self.admin_site.name)
+        return HttpResponseRedirect(post_url)
 
     def response_action(self, request, queryset):
         """
diff --git a/django/contrib/auth/admin.py b/django/contrib/auth/admin.py
index de5abce..7b81667 100644
--- a/django/contrib/auth/admin.py
+++ b/django/contrib/auth/admin.py
@@ -153,7 +153,7 @@ class UserAdmin(admin.ModelAdmin):
             'admin/auth/user/change_password.html',
             context, current_app=self.admin_site.name)
 
-    def response_add(self, request, obj, post_url_continue='../%s/'):
+    def response_add(self, request, obj, post_url_continue=None):
         """
         Determines the HttpResponse for the add_view stage. It mostly defers to
         its superclass implementation but is customized because the User model
