summaryrefslogtreecommitdiff
path: root/django/urls
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:13:48 -0400
commit39283c8edbc5991b589d48a8e17152042193f2df (patch)
treed6d9252b66050f139c70a56ca4c7490aecc1273c /django/urls
parente01fa015c0fca32bb740b575c8fbfd388d8f4957 (diff)
Fixed #29415 -- Fixed detection of custom URL converters in included patterns.
Diffstat (limited to 'django/urls')
-rw-r--r--django/urls/base.py4
-rw-r--r--django/urls/resolvers.py8
2 files changed, 8 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 7343f6616a..ce8c7ffa32 100644
--- a/django/urls/resolvers.py
+++ b/django/urls/resolvers.py
@@ -68,11 +68,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])
@@ -439,7 +441,7 @@ class URLResolver:
new_matches,
p_pattern + pat,
{**defaults, **url_pattern.default_kwargs},
- {**self.pattern.converters, **converters}
+ {**self.pattern.converters, **url_pattern.pattern.converters, **converters}
)
)
for namespace, (prefix, sub_pattern) in url_pattern.namespace_dict.items():