I’m getting into django and this is getting me a headache. I’m trying to get a simple GET variable. URL is site.com/search/?q=search-term
My view is:
def search(request): if request.method == 'GET' and 'q' in request.GET: q = request.GET.get('q', None) if q is not None: results = Task.objects.filter( Q(title__contains=q) | Q(description__contains=q), ) ...return... else: ... else: ...
Search queries like mysite.com/search/? (without q) get through the first if correctly.
The problem is in queries like mysite.com/search/?q=. They don’t get caught by
if q is not None:
So, the short answer would be How can I check
q == None? (I’ve already tried
None, etc, to no avail.)
‘==’ can be thought of as “value equality”, that is, if two things look
the same, == should return a true value. (For those with a Java
background, Python’s == is actually doing something akin to an equals()
‘is’ can be thought of as ‘object
identity’, that is, if the two things
actually are the same object.
First, check if the
request.GET dict contains a parameter named
q. You’re doing this properly already:
if request.method == 'GET' and 'q' in request.GET:
Next, check if the value of
q is either
None or the empty string. To do that, you can write this:
q = request.GET['q'] if q is not None and q != '': # Do processing here
Notice that it is not necessary to write
request.GET.get('q', None). We’ve already checked to make sure there is a
'q' key inside the
request.GET dict, so we can grab the value directly. The only time you should use the
get method is if you’re not sure a dict has a certain key and want to avoid raising a KeyError exception.
However, there is an even better solution based on the following facts:
''also evaluates to
So now you can write:
q = request.GET['q'] if q: # Do processing here
See these other resources for more details: