#29775: custom url converters are not picked up on reverse when part of included
patterns with namespace
-------------------------------------+-------------------------------------
Reporter: Eric Brandwein | Owner: nobody
Type: Bug | Status: closed
Component: Core (URLs) | Version: 2.1
Severity: Normal | Resolution: needsinfo
Keywords: converter, | Triage Stage:
namespace, reverse, include | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Comment (by Eric Brandwein):
Hi Carlton, the issue happens when you have some URL with a custom
converter, in which you are including other URLs without passing a
namespace to `include()`. These other URLs, in turn, include another list
of URLs, this time with a namespace. The tests you mention seem to just
test namespacing from the first level of URLs, instead of from just the
second, like in the example I gave. It would seem that when using instance
namespaces, the converters are only searched from one `include()` upwards,
instead of from all the `include()` "tree".
I made a test for it here:
https://github.com/ericbrandwein/django/commit/de60d4f200ef08573f92942f0269a4b22a878290.
The diff is:
{{{
diff --git a/tests/urlpatterns/path_base64_urls.py
b/tests/urlpatterns/path_base64_urls.py
index 9b69f929fe..c9b4f6f9ca 100644
--- a/tests/urlpatterns/path_base64_urls.py
+++ b/tests/urlpatterns/path_base64_urls.py
@@ -4,8 +4,14 @@ from . import converters, views
register_converter(converters.Base64Converter, 'base64')
+subsubpatterns = [
+ path('<base64:last_value>/', views.empty_view, name='subsubpattern-
base64'),
+]
+
subpatterns = [
path('<base64:value>/', views.empty_view, name='subpattern-base64'),
+ path('<base64:value>/',
+ include((subsubpatterns, 'second-layer-namespaced-base64'),
'instance-ns-base64')),
]
urlpatterns = [
diff --git a/tests/urlpatterns/tests.py b/tests/urlpatterns/tests.py
index b3d97ec5b9..8483d225d5 100644
--- a/tests/urlpatterns/tests.py
+++ b/tests/urlpatterns/tests.py
@@ -70,6 +70,17 @@ class SimplifiedURLTests(SimpleTestCase):
url = reverse(url_name, kwargs=kwargs)
self.assertEqual(url, expected)
+ @override_settings(ROOT_URLCONF='urlpatterns.path_base64_urls')
+ def
test_converter_reverse_with_second_layer_instance_namespace(self):
+ expected = '/base64/aGVsbG8=/namespaced/d29ybGQ=/d29ybGQ=/'
+ url_name = 'subsubpattern-base64'
+ instance_ns = 'instance-ns-base64'
+ kwargs = included_kwargs
+ kwargs['last_value'] = b'world'
+ url_name = '%s:%s' % (instance_ns, url_name)
+ url = reverse(url_name, kwargs=kwargs)
+ self.assertEqual(url, expected)
+
def test_path_inclusion_is_matchable(self):
match = resolve('/included_urls/extra/something/')
self.assertEqual(match.url_name, 'inner-extra')
}}}
Maybe this test is somewhat ugly, but it shows the bug. It fails with this
message:
{{{
django.urls.exceptions.NoReverseMatch: Reverse for 'subsubpattern-base64'
with keyword arguments '{'base': b'hello', 'value': b'world',
'last_value': b'world'}' not found. 1 pattern(s) tried:
['base64/(?P<base>[a-zA-Z0-9+/]*={0,2})/subpatterns/(?P<value>[a-zA-Z0-9+/]*={0,2})/(?P<last_value>[a-zA-Z0-9+/]*={0,2})/$']
}}}
Which means that the converter's `regex` is being used, but not its
`to_url` function.
--
Ticket URL: <https://code.djangoproject.com/ticket/29775#comment:3>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/071.c6342e837ee67f262dda31255e3ce4d9%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.