Opened 11 years ago

Closed 11 years ago

#20645 closed Uncategorized (invalid)

reverse URL broken when you use includes

Reported by: ryan.ploetz@… Owned by: nobody
Component: Template system Version: 1.5
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Ramiro Morales)

if you use an include in your base URLConf and then use a name='' in that subsequent URLConf, the name doesn't resolve when you do a reverse match in the url tag in a template.

Example:

Root

urls.py

urlpatterns = patterns('',

    url(r'^bar/', include('bar.urls')),

)

Bar
urls.py

urlpatterns = patterns('bar.views',

    url(r'^makeFoo/$', foo, name="generateFoo"),

)

in a HTML Template

{% url "generateFoo" %}

This generates a NoReverseMatch

If you put that named url in the root url patterns, the Reverse will find it and render it normally.

Change History (3)

comment:1 by Ramiro Morales, 11 years ago

Description: modified (diff)

Made description readable.

comment:2 by ryan.ploetz@…, 11 years ago

I've kept digging into this and it seems to be the '$' after the trailing slash if you do an include(). If that is there, the reverse won't be found. So in the above example, I forgot to add bar/$ which causes it to break. If the "$" is not there, the reverse will be found like normal.

Is this how it is supposed to work? It seems that this regular expression shouldn't be taken into consideration when using a reverse url matching via the 'name' or view name. Any comment by a senior Django dev about this would be useful.

comment:3 by Ramiro Morales, 11 years ago

Resolution: invalid
Status: newclosed

Please read the documentation first (https://docs.djangoproject.com/en/1.5/topics/http/urls/) and ask support questions via the right channels (https://code.djangoproject.com/wiki/TicketClosingReasons/UseSupportChannels).

The reported case works (as in reverses the URL and doesn't raise NoReverseMatch) with both "generateFoo" entry having and not having the trailing $ although the latter makes no sense (the details are in the documentation):

In [1]: from django.core.urlresolvers import reverse

In [2]: reverse('generateFoo')
Out[2]: '/bar/makeFoo/'

In [3]: from django.template import Context, Template

In [4]: t = Template("{% url 'generateFoo' %}")

In [5]: t.render(Context())
Out[5]: u'/bar/makeFoo/'
Note: See TracTickets for help on using tickets.
Back to Top