diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 2d5a5cf9330..164b245a7f1 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -11,7 +11,7 @@ from django.contrib.admin import widgets, helpers from django.contrib.admin import validation from django.contrib.admin.checks import (BaseModelAdminChecks, ModelAdminChecks, InlineModelAdminChecks) -from django.contrib.admin.utils import (unquote, flatten_fieldsets, +from django.contrib.admin.utils import (quote, unquote, flatten_fieldsets, get_deleted_objects, model_format_dict, NestedObjects, lookup_needs_distinct) from django.contrib.admin.templatetags.admin_static import static @@ -1099,7 +1099,7 @@ class ModelAdmin(BaseModelAdmin): if post_url_continue is None: post_url_continue = reverse('admin:%s_%s_change' % (opts.app_label, opts.model_name), - args=(pk_value,), + args=(quote(pk_value),), current_app=self.admin_site.name) post_url_continue = add_preserved_filters({'preserved_filters': preserved_filters, 'opts': opts}, post_url_continue) return HttpResponseRedirect(post_url_continue) diff --git a/tests/admin_views/tests.py b/tests/admin_views/tests.py index 32914c33a43..ae6c66dc378 100644 --- a/tests/admin_views/tests.py +++ b/tests/admin_views/tests.py @@ -1777,6 +1777,30 @@ class AdminViewStringPrimaryKeyTest(TestCase): args=(quote(self.pk),)) self.assertContains(response, '