JimJay
JimJay

Reputation: 349

Django url regexp not working

I'm trying to get my head around regexp in Django urls. I'm currently developing locally and I want to be able to direct a request such as http://localhost:8000/options/items/item-string-1121/ to the 'details' view in my app called 'options', passing in the final number part of the request string (1121) as a parameter 'id' to the view function.

The signature for details in options/views.py is as follows, taking id=1 as default:

def details(request, id=1):
    ...

I have the following in my root urls.py:

...

urlpatterns += patterns('',
    url(r'^options/, include(options.urls')),
)

and in options/urls.py:

urlpatterns = patterns('options.views', 
    url(r'^items/(.+)(P<id>\d+)/$', 'details'),
    ...
)

Now when I try to request the above URL the dev server says it tried to match against the pattern ^options/ ^items/(.+)(P<id>\d+)/$ but it doesn't match.

Can anyone see the problem?

Upvotes: 1

Views: 699

Answers (2)

Burhan Khalid
Burhan Khalid

Reputation: 174614

You are missing quotes.

urlpatterns += patterns('',
    url(r'^options/, include(options.urls')),
)

Should be

urlpatterns += patterns('',
    url(r'^options/', include('options.urls')),
)

I'm not too sure of your expression, might try this:

urlpatterns = patterns('options.views', 
    url(r'^items/(?<=-)(?P<id>\d+)/$', 'details'),
    ...
)

Upvotes: 0

coderanger
coderanger

Reputation: 54181

You need a non-greedy quantifier on the (.+), so r'^items/(.+?)(P\d+)/$'. Otherwise that first glob happily eats until the end of the string, preventing the ID from ever matching.

Upvotes: 3

Related Questions