tags:

views:

13319

answers:

3

I am currently defining regular expressions in order to capture parameters in a url, as described in the tutorial. How do I access parameters from the url as part the HttpRequest object? My HttpRequest.GET currently returns an empty QueryDict object.

I'd like to learn how to do this without a library so I can get to know Django better.

+24  A: 

If your url is something like http://domain/search/?q=haha, then you would use request.GET.get('q', '').

q is the parameter you want, and '' is the default value if q isn't found.

If you are instead just configuring your URLconf, then your captures from the regex are passed to the function as arguments (or named arguments).

such as

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

then in your views.py you would have

def profile_page(request, username):
camflan
Is '?param=' the only way Django recognizes parameters? Is there a way to use URLconf with HTTP.GET? I'd like to do /param/2.
thaiyoshi
Check the second part of my response regarding your URLconf and regex captures.
camflan
Ok. I am currently using the second method. Seems like they are separate mechanisms, and I'm trying to blend them. Thanks!
thaiyoshi
No problem. use request.GET if you submit a form using GET, use request.POST if you submit a form using POST, and if you just want to configure URLs to have variable sections, then it's a URLconf/view argument.
camflan
+3  A: 

This is not exactly what you asked for but this snippet is helpful for managing querystrings in templates.

jamting
+15  A: 

To clarify camflan's explanation, let's suppose you have

  • the rule url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a in incoming request for http://domain/user/thaiyoshi/?message=Hi

The URL dispatcher rule will catch parts of the URL path (here "user/thaiyoshi/") and pass them to the view function along with the request object.

The query string (here message=Hi) is parsed and parameters are stored as a QueryDict in request.GET. No further matching or processing for HTTP GET parameters is done.

This view function would use both parts extracted from the URL path and a query parameter:

def profile_page(request, username=None):
    user = User.objects.get(username=username)
    message = request.GET.get('message')

As a side note, you'll find the request method (in this case "GET", and for submitted forms usually "POST") in request.method. In some cases it's useful to check that it matches what you're expecting.

Update: When deciding whether to use the URL path or the query parameters for passing information, the following may help:

  • use the URL path for uniquely identifying resources, e.g. /blog/post/15/ (not /blog/posts/?id=15)
  • use query parameters for changing the way the resource is displayed, e.g. /blog/post/15/?show_comments=1 or /blog/posts/2008/?sort_by=date&direction=desc
  • to make human friendly URLs, avoid using ID numbers and use e.g. dates, categories and/or slugs: /blog/post/2008/09/30/django-urls/
akaihola