tags:

views:

40

answers:

4

It seems I cant make this example print "You submitted nothing!". Everytime I submit an empty form it says:

You submitted: u''

instead of:

You submitted nothing!

Where did I go wrong?

views.py

def search(request):
    if 'q' in request.GET:
        message = 'You submitted: %r' % request.GET['q']
    else:
        message = 'You submitted nothing!'

    return HttpResponse(message)

template:

<html>
    <head>
        <title> Search </title>
    </head>
    <body>
        <form action="/search/"  method="get" >
        <input type="text" name = "q">
        <input type="submit"value="Search"/>
        </form>
    </body>
</html>
+2  A: 

since your form has a field called 'q', leaving it blank still sends an empty string.

try

if 'q' in request.GET and request.GET['q'] != "" :
     message
else
     error message
second
+3  A: 

Calling /search/ should result in "you submitted nothing", but calling /search/?q= on the other hand should result in "you submitted u''"

Browsers have to add the q= even when it's empty, because they have to include all fields which are part of the form. Only if you do some DOM manipulation in Javascript (or a custom javascript submit action), you might get such a behavior, but only if the user has javascript enabled. So you should probably simply test for non-empty strings, e.g:

if request.GET.get('q'):
    message = 'You submitted: %r' % request.GET['q']
else:
    message = 'You submitted nothing!'
tux21b
Wouldn't this throw exception if q does not exists in dict?
rebus
No, calling `dict.get(key, default=None)` will either return the value stored for the key, or the default otherwise. In that case `None` is returned and both, `u''` and `None` evaluate to `False`. So, get() is a useful method when you don't want an exception to be thrown.
tux21b
Oooh! You are right, not sure what I was thinking this morning.
rebus
Ok. Thanks. Not sure what the second get is doing here. But it worked. So I will find out now.
MacPython
`get()` is a method of the `dict` type. Like lists have methods like `append()` and `sort()`, dicts are having methods like `iterkeys()`, `iteritems()` and `get()` (to only mention a few of them). It's just coincidence that your dict is also called `GET`.
tux21b
+1  A: 
q = request.GET.get("q", None)
if q:
    message = 'q= %s' % q
else:
    message = 'Empty'
rebus
A: 

In python, None, 0, ""(empty string), False are all accepted None.

So:

if request.GET['q']: // true if q contains anything but not ""
    message
else : //// since this returns "" ant this is equals to None
    error
FallenAngel