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

Nac*_*cho 24 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:
        ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

Wes*_*ley 40

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

if request.method == 'GET' and 'q' in request.GET:
Run Code Online (Sandbox Code Playgroud)

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

q = request.GET['q']
if q is not None and q != '':
    # Do processing here
Run Code Online (Sandbox Code Playgroud)

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

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

  • 该值的None计算结果为False
  • 空字符串''也计算为False
  • 任何非空字符串的计算结果为True.

所以现在你可以写:

q = request.GET['q']
if q:
    # Do processing here
Run Code Online (Sandbox Code Playgroud)

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