如何检查request.GET var是否为None?

时间:2010-03-11 02:00:30

标签: python django

我正在进入django,这让我很头疼。我正在尝试获得一个简单的GET变量。网址为 site.com/search/?q=search-term

我的观点是:

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:
        ...

mysite.com/search /?(没有q)等搜索查询如果正确的话可以通过第一个查询。

问题出在 mysite.com/search/?q = 等查询中。他们不会被if q is not None:

抓住

所以,简短的回答是如何检查q == None? (我已经尝试''None等,但无济于事。)

2 个答案:

答案 0 :(得分:39)

首先,检查request.GET dict是否包含名为q的参数。你已经正确地做到了这一点:

if request.method == 'GET' and 'q' in request.GET:

接下来,检查q的值是None还是空字符串。要做到这一点,你可以这样写:

q = request.GET['q']
if q is not None and q != '':
    # Do processing here

请注意,没有必要写request.GET.get('q', None)。我们已经检查过以确保'q' dict中有request.GET个密钥,因此我们可以直接获取该值。您应该使用get方法的唯一时间是,如果您不确定某个密钥是否具有某个密钥并且希望避免引发KeyError异常。

然而,基于以下事实,有一个更好的解决方案:

  • None评估为False
  • 空字符串''也评估为False
  • 任何非空字符串的计算结果为True

现在你可以写:

q = request.GET['q']
if q:
    # Do processing here

有关详细信息,请参阅以下其他资源:

答案 1 :(得分:1)

感谢@Ned的澄清。 找到了完整的解释here

基本上:

  

'=='可以被认为是“价值平等”,也就是说,如果看起来有两件事   同样,==应该返回一个真值。 (对于那些有Java的人   背景,Python的==实际上做的事情类似于equals()   方法。)

     

'是'可以被认为是'对象   身份',即两件事   实际上是同一个对象。