diff options
| author | Xaroth Brook <xaroth@xaroth.nl> | 2018-05-26 22:56:17 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-05-26 20:52:48 -0400 |
| commit | 1adac352d3cd64d2193f9cd56e1e97b0022d6c48 (patch) | |
| tree | 1ac9405d502cffc2ced598020087adede12d3424 /django | |
| parent | 0b1744b66cad49592d561591f59ce1893c800aee (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.py | 4 | ||||
| -rw-r--r-- | django/urls/resolvers.py | 10 |
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(): |
