import urlparse from django.contrib import admin from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect from django.utils.translation import ugettext_lazy, ugettext as _ from django.utils.encoding import force_unicode class MyModelAdmin(admin.ModelAdmin): def response_change(self, request, obj): """ Determines the HttpResponse for the change_view stage. We are returning the user to a filtered changelist page from the change screen when the user presses save. This makes for more intutive editing of filtered objects since upon saving you will be redirected back to the filtered changelist page. Requires that in your admin/change_form.html you add a hidden form input named "_go_to_on_save" that you can populate with the value from request.META.HTTP_REFERER as below: {% block after_related_objects %}{% if request.META.HTTP_REFERER %}{% endif %}{% endblock %} """ opts = obj._meta msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj)} if request.POST.has_key("_go_to_on_save") and urlparse.urlparse(request.POST['_go_to_on_save']).query\ and request.get_host() in request.POST['_go_to_on_save']\ and not (request.POST.has_key("_continue") or request.POST.has_key("_saveasnew") or\ request.POST.has_key("_addanother")): self.message_user(request, msg) change_url = reverse('admin:%s_%s_changelist' % (self.model._meta.app_label, self.model._meta.module_name)) potential_go_to_url = urlparse.urlparse(request.POST['_go_to_on_save']) if change_url == potential_go_to_url.path: query = urlparse.urlparse(request.POST['_go_to_on_save']).query return HttpResponseRedirect(change_url+'?'+query) return super(MyModelAdmin, self).response_change(request, obj)