Browse Source

Merge pull request #900 from bmispelon/ticket-20022

Fix #20022: Correctly handle prefixes with url-unsafe characters in reverse()
Jacob Kaplan-Moss 12 năm trước cách đây
mục cha
commit
e4d9f8aed1
2 tập tin đã thay đổi với 6 bổ sung1 xóa
  1. 1 1
      django/core/urlresolvers.py
  2. 5 0
      tests/urlpatterns_reverse/tests.py

+ 1 - 1
django/core/urlresolvers.py

@@ -388,7 +388,7 @@ class RegexURLResolver(LocaleRegexProvider):
                     if len(args) != len(params) + len(prefix_args):
                         continue
                     unicode_args = [force_text(val) for val in args]
-                    candidate = (prefix_norm + result) % dict(zip(prefix_args + params, unicode_args))
+                    candidate = (prefix_norm.replace('%', '%%') + result) % dict(zip(prefix_args + params, unicode_args))
                 else:
                     if set(kwargs.keys()) | set(defaults.keys()) != set(params) | set(defaults.keys()) | set(prefix_args):
                         continue

+ 5 - 0
tests/urlpatterns_reverse/tests.py

@@ -183,6 +183,11 @@ class URLPatternReverse(TestCase):
         self.assertEqual('/bump%2520map/includes/non_path_include/',
                reverse('non_path_include', prefix='/bump%20map/'))
 
+    def test_non_urlsafe_prefix_with_args(self):
+        # Regression for #20022
+        self.assertEqual('/%7Eme/places/1/',
+                reverse('places', args=[1], prefix='/~me/'))
+
 class ResolverTests(unittest.TestCase):
     def test_resolver_repr(self):
         """