Opened 9 months ago

Closed 9 months ago

Last modified 9 months ago

#35244 closed New feature (duplicate)

URL resolution does not work with a namespaced function reference.

Reported by: Willem Van Onsem Owned by: nobody
Component: Core (URLs) Version: 5.0
Severity: Normal Keywords: urls, resolve, reverse, resolution
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

First mentioned on StackOverflow with: https://stackoverflow.com/questions/78035103/in-django-is-it-possible-to-use-reverse-redirect-with-a-view-function-not-stri

This is because the .reverse_dict dictionary is not populated with view functions, or at least not if there is an app_name around line 563 of resolvers.py: https://github.com/django/django/blob/6feaad9113fd38ba3970032d2b7856c77403e29e/django/urls/resolvers.py#L563-L567

A patch is quite simple: look in the .reverse_dict of the subpath, and propagate the values to the upper level in case these are callable (see patch).

But the question is of course if this approach is sound and complete.

Attachments (1)

resolver_view_function.patch (1.7 KB ) - added by Willem Van Onsem 9 months ago.

Download all attachments as: .zip

Change History (3)

by Willem Van Onsem, 9 months ago

comment:1 by Mariusz Felisiak, 9 months ago

Resolution: duplicate
Status: newclosed
Summary: URL resolution does not work when giving a function reference if it is listed in `urls` with `app_name`URL resolution does not work with a namespaced function reference.
Type: UncategorizedNew feature

In the future, please include a complete ticket description and don't force reviewers to investigate what you actually want to report. You also didn't include any test which makes it even more difficult to understand what you want to accomplish.

As far as I'm aware it's about passing a view to the reverse() which is officially discouraged in the docs (especially for namespaced views).

Duplicate of #17914.

comment:2 by Willem Van Onsem, 9 months ago

It is indeed discouraged, but the fact that app_name "breaks" it, is a bit of an "admission of weakness". Indeed, there are Django apps that could use reverse and plug in a view function reference. Now if one would use such Django app, and then later include it in urls.py with an app_name, the problems start occurring, so either it makes sense to disable passing view function references at all, or these have to span over the entire app.

The patch is just some fast prototyping, I think the main problem is "proving" its soundness and completeness, which is of course difficult, given the nice Christmas tree that building the reverse dictionary has become :).

Note: See TracTickets for help on using tickets.
Back to Top