summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorXaroth Brook <xaroth@xaroth.nl>2018-05-26 22:56:17 +0200
committerTim Graham <timograham@gmail.com>2018-05-26 20:52:48 -0400
commit1adac352d3cd64d2193f9cd56e1e97b0022d6c48 (patch)
tree1ac9405d502cffc2ced598020087adede12d3424 /django
parent0b1744b66cad49592d561591f59ce1893c800aee (diff)
[2.0.x] Fixed #29415 -- Fixed detection of custom URL converters in included patterns.
Backport of 39283c8edbc5991b589d48a8e17152042193f2df from master
Diffstat (limited to 'django')
-rw-r--r--django/urls/base.py4
-rw-r--r--django/urls/resolvers.py10
2 files changed, 10 insertions, 4 deletions
diff --git a/django/urls/base.py b/django/urls/base.py
index 6dccdd2e7d..1e11e05bec 100644
--- a/django/urls/base.py
+++ b/django/urls/base.py
@@ -49,6 +49,7 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None):
resolved_path = []
ns_pattern = ''
+ ns_converters = {}
while path:
ns = path.pop()
current_ns = current_path.pop() if current_path else None
@@ -74,6 +75,7 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None):
extra, resolver = resolver.namespace_dict[ns]
resolved_path.append(ns)
ns_pattern = ns_pattern + extra
+ ns_converters.update(resolver.pattern.converters)
except KeyError as key:
if resolved_path:
raise NoReverseMatch(
@@ -83,7 +85,7 @@ def reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None):
else:
raise NoReverseMatch("%s is not a registered namespace" % key)
if ns_pattern:
- resolver = get_ns_resolver(ns_pattern, resolver)
+ resolver = get_ns_resolver(ns_pattern, resolver, tuple(ns_converters.items()))
return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py
index 141913fbb2..c5b0811136 100644
--- a/django/urls/resolvers.py
+++ b/django/urls/resolvers.py
@@ -69,11 +69,13 @@ def get_resolver(urlconf=None):
@functools.lru_cache(maxsize=None)
-def get_ns_resolver(ns_pattern, resolver):
+def get_ns_resolver(ns_pattern, resolver, converters):
# Build a namespaced resolver for the given parent URLconf pattern.
# This makes it possible to have captured parameters in the parent
# URLconf pattern.
- ns_resolver = URLResolver(RegexPattern(ns_pattern), resolver.url_patterns)
+ pattern = RegexPattern(ns_pattern)
+ pattern.converters = dict(converters)
+ ns_resolver = URLResolver(pattern, resolver.url_patterns)
return URLResolver(RegexPattern(r'^/'), [ns_resolver])
@@ -438,13 +440,15 @@ class URLResolver:
for name in url_pattern.reverse_dict:
for matches, pat, defaults, converters in url_pattern.reverse_dict.getlist(name):
new_matches = normalize(p_pattern + pat)
+ new_converters = dict(self.pattern.converters, **url_pattern.pattern.converters)
+ new_converters = dict(new_converters, **converters)
lookups.appendlist(
name,
(
new_matches,
p_pattern + pat,
dict(defaults, **url_pattern.default_kwargs),
- dict(self.pattern.converters, **converters)
+ new_converters
)
)
for namespace, (prefix, sub_pattern) in url_pattern.namespace_dict.items():