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:13:48 -0400 |
| commit | 39283c8edbc5991b589d48a8e17152042193f2df (patch) | |
| tree | d6d9252b66050f139c70a56ca4c7490aecc1273c /django/urls | |
| parent | e01fa015c0fca32bb740b575c8fbfd388d8f4957 (diff) | |
Fixed #29415 -- Fixed detection of custom URL converters in included patterns.
Diffstat (limited to 'django/urls')
| -rw-r--r-- | django/urls/base.py | 4 | ||||
| -rw-r--r-- | django/urls/resolvers.py | 8 |
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(): |
