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

33 投票
2 回答
61523 浏览
提问于 2025-04-15 20:17

我正在学习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的情况)的搜索请求可以顺利通过第一个if判断。

但问题出在像 mysite.com/search/?q= 这样的请求上。它们没有被 if q is not None: 这个判断捕捉到。

所以,简单来说,我想知道怎么检查 q == None?(我已经试过 ''None 等等,但都没用。)

2 个回答

2

感谢@Ned的澄清。

我找到了一份完整的解释,在这里

简单来说:

'=='可以理解为“值相等”,也就是说,如果两个东西看起来一样,使用==应该返回真值。(对于有Java背景的人来说,Python的==实际上类似于equals()方法。)

'is'可以理解为“对象身份”,也就是说,如果这两个东西实际上是同一个对象。

58

首先,检查一下 request.GET 这个字典里有没有一个叫 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)。因为我们已经确认了 request.GET 这个字典里有 'q' 这个键,所以可以直接取值。只有在你不确定字典里是否有某个键的时候,才需要用 get 方法,这样可以避免出现 KeyError 错误。

不过,还有更好的解决方案,基于以下几点:

  • None 被认为是 False
  • 空字符串 '' 也被认为是 False
  • 任何非空字符串都被认为是 True

所以现在你可以这样写:

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

想了解更多细节,可以查看这些资源:

撰写回答