diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -17,6 +17,7 @@
from django.utils.text import capfirst, get_text_list
from django.utils.translation import ugettext as _
from django.utils.encoding import force_unicode
+from urllib import quote as urllib_quote
try:
set
except NameError:
@@ -26,6 +27,10 @@
# returns the
class for a given radio_admin field
get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
+# Query string variable where the previous URL will be passed to both change
+# and add views so they can redirect the user back to it when they are finished
+RETURN_URL = 'return_to'
+
class IncorrectLookupParameters(Exception):
pass
@@ -469,11 +474,14 @@
return HttpResponseRedirect(request.path)
else:
self.message_user(request, msg)
-
- # Figure out where to redirect. If the user has change permission,
+
+ # Figure out where to redirect. If we have been given an change list URL
+ # (possibly filtered), go back to that URL. Otherwise 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):
+ if RETURN_URL in request.GET:
+ post_url = request.GET[RETURN_URL]
+ elif self.has_change_permission(request, None):
post_url = '../'
else:
post_url = '../../../'
@@ -502,8 +510,9 @@
return HttpResponseRedirect("../add/")
else:
self.message_user(request, msg)
- return HttpResponseRedirect("../")
-
+ post_url = request.GET.get(RETURN_URL, '../')
+ return HttpResponseRedirect(post_url)
+
def add_view(self, request, form_url='', extra_context=None):
"The 'add' admin view for this model."
model = self.model
@@ -515,6 +524,8 @@
ModelForm = self.get_form(request)
formsets = []
if request.method == 'POST':
+ return_to = request.GET.get(RETURN_URL, None)
+
form = ModelForm(request.POST, request.FILES)
if form.is_valid():
form_validated = True
@@ -550,7 +561,12 @@
for FormSet in self.get_formsets(request):
formset = FormSet(instance=self.model())
formsets.append(formset)
-
+
+ return_to = request.META.get('HTTP_REFERER', None)
+
+ if return_to:
+ form_url = form_url + '?%s=%s' % (RETURN_URL, urllib_quote(return_to))
+
adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
media = self.media + adminForm.media
@@ -573,7 +589,7 @@
'app_label': opts.app_label,
}
context.update(extra_context or {})
- return self.render_change_form(request, context, add=True)
+ return self.render_change_form(request, context, form_url=form_url, add=True)
add_view = transaction.commit_on_success(add_view)
def change_view(self, request, object_id, extra_context=None):
@@ -601,6 +617,8 @@
ModelForm = self.get_form(request, obj)
formsets = []
if request.method == 'POST':
+ return_to = request.GET.get(RETURN_URL, None)
+
form = ModelForm(request.POST, request.FILES, instance=obj)
if form.is_valid():
form_validated = True
@@ -628,7 +646,14 @@
for FormSet in self.get_formsets(request, obj):
formset = FormSet(instance=obj)
formsets.append(formset)
-
+
+ return_to = request.META.get('HTTP_REFERER', None)
+
+ if return_to:
+ form_url = '?%s=%s' % (RETURN_URL, urllib_quote(return_to))
+ else:
+ form_url = ''
+
adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields)
media = self.media + adminForm.media
@@ -652,7 +677,7 @@
'app_label': opts.app_label,
}
context.update(extra_context or {})
- return self.render_change_form(request, context, change=True, obj=obj)
+ return self.render_change_form(request, context, change=True, form_url=form_url, obj=obj)
change_view = transaction.commit_on_success(change_view)
def changelist_view(self, request, extra_context=None):