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.
When url is like:
domain/search/?q=haha
, Then you would userequest.GET.get('q', '')
.q
is the parameter you want, And''
is the default value ifq
isn't found.However, if you are instead just configuring your
URLconf
, Then your captures from theregex
are passed to the function as arguments (or named arguments).Such as:
Then in your
views.py
you would haveThis is not exactly what you asked for, but this snippet is helpful for managing
query_strings
intemplates
.To clarify camflan's explanation, let's suppose you have
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
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 aQueryDict
inrequest.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:
As a side note, you'll find the request method (in this case
"GET"
, and for submitted forms usually"POST"
) inrequest.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:
/blog/post/15/
(not/blog/posts/?id=15
)/blog/post/15/?show_comments=1
or/blog/posts/2008/?sort_by=date&direction=desc
/blog/post/2008/09/30/django-urls/
You have two common ways to do that in case your url looks like that:
v1:
If specific key is mandatory you can use:
This will return a value of
a
if key exists and an Exception if not.v2:
If your keys are optional:
You can try that without any argument this will not crash. So you can wrap it with
try: except:
and returnHttpResponseBadRequest()
in example. This is a simple way to make your code less complex, without using special Exceptions handling.I would like to share a tip that may save you some time.
If you plan to use something like this in your
urls.py
file:Which basically means
www.example.com/<username>
. Be sure to place it at the end of your URL entries, because otherwise, it is prone to cause conflicts with the URL entries that follow below, i.e. accessing one of them will give you the nice error:User matching query does not exist.
I've just experienced it myself; hope it helps!