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.)
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:
'==' 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() method.)
'is' can be thought of as 'object identity', that is, if the two things actually are the same object.