#36796 closed Bug (fixed)
URL resolution breaks if route defined with lazy string and uses an include
| Reported by: | Andrea Angelini | Owned by: | Kundan Yadav |
|---|---|---|---|
| Component: | Core (URLs) | Version: | 6.0 |
| Severity: | Release blocker | Keywords: | gettext_lazy, lazy |
| Cc: | Andrea Angelini, Jake Howard | Triage Stage: | Ready for checkin |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
After this commit:
https://github.com/django/django/commit/f920937c8a63df6bea220e4386f59cdb45b2e355
this is not working if self._route is gettext_lazy('test'):
elif path.startswith(self._route):
return path.removeprefix(self._route), (), {}
More info here:
https://forum.djangoproject.com/t/gettext-lazy-and-url-patterns/43703
Change History (13)
comment:1 by , 4 weeks ago
| Cc: | added |
|---|---|
| Type: | Uncategorized → Bug |
comment:2 by , 4 weeks ago
| Cc: | added |
|---|---|
| Keywords: | gettext_lazy lazy added |
| Severity: | Normal → Release blocker |
| Summary: | gettext_lazy and url patterns → URL resolution breaks if route defined with lazy string and uses an include |
| Triage Stage: | Unreviewed → Accepted |
comment:3 by , 4 weeks ago
Amended like following fixes this issue:
elif path.startswith(str(self._route)):
return path.removeprefix(str(self._route)), (), {}
comment:4 by , 4 weeks ago
I'd missed that lazy string were accepted, and surprised a test didn't cover this behaviour.
Just handling the elif case won't quite work, since there's also the endpoint case. Converting self._route to a string (as part of match, rather than the constructor so it's evaluated in the correct context) sounds like the right solution. It'd be nice if the conversion only happens once per match to avoid unnecessary extra work.
comment:5 by , 4 weeks ago
I agree with you that it should be converted to a string as part of match and not as I proposed here
comment:6 by , 4 weeks ago
In the endpoint seems accidentally to work though because gettext_lazy('test') == 'test' returns True, while
'test'.startswith(gettext_lazy('test')) and 'test'.removeprefix(gettext_lazy('test')) throw an error
comment:7 by , 4 weeks ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:9 by , 4 weeks ago
| Needs tests: | set |
|---|---|
| Patch needs improvement: | set |
comment:10 by , 3 weeks ago
| Needs documentation: | set |
|---|
comment:11 by , 2 weeks ago
| Needs documentation: | unset |
|---|---|
| Needs tests: | unset |
| Patch needs improvement: | unset |
| Triage Stage: | Accepted → Ready for checkin |
Thanks, replicated like this (traceback given in forum post):
It's documented that the
routearg topath()can take a lazy string.