I’m just learning Django, and am getting stuck with some url logic. I’m trying to allow either a category name or id in the url:
...
url(r'^(?P<booze_q>\w+|\d+)/$','glasses.views.booze'),
...
And then in thew view, only deal with that result once. However, if the url is a string – in this case, Whiskey, I get an error for trying to pass a string where an int is expected. This is the closest I’ve gotten so far:
def booze(request, booze_q):
booze = get_object_or_404(Booze,Q(pk=booze_q)|Q(name=booze_q))
return render_to_response('booze/detail.html', {'booze': booze})
But this returns an error: invalid literal for int() with base 10: 'Whiskey'
I’m sure it’s a pretty easy thing, but this is my first Django app, so any help would be appreciated.
tl;dr: End result, I’d like mysite.com/1/ or mysite.com/Whiskey/ to both call the glasses.views.booze view, and get the object with id=1 or name=Whiskey
You will always get a string, even if the string contains a number.
1) You should not have a parameter that could be either an id or something else. One day you will enter an item whose name is a number and your app will fail.
2) When querying for
pkwith a string django automatically tries to convert it into an integer. You’ll have to handle the non-pk case before constructing that query.