2010-03-11 32 views
23

嘿,我正在进入django,这让我很头疼。 我想获得一个简单的GET变量。网址是site.com/search/?q=search-term如何检查request.GET var是否?

我的看法是:

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=查询。他们不要被抓到如果q是不无:

所以,简单的答案会是怎样查询q ==“”? (我已经尝试了'',None等等,但无济于事。)

+0

一个简单的**如果q **而不是**,如果q不是无(或'')**的窍门。任何人都有这样的解释? – Nacho 2010-03-11 02:09:12

+2

一般来说,在Python中使用'is'运算符时需要非常谨慎。通常你想要一个相等测试('=='),而不是一个身份测试('is')。一系列非零长度测试“真”。 – 2010-03-11 02:23:44

回答

33

首先,检查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 

看到这些资料,让更多的细节:

+0

谢谢,这是很好的信息。 另外,我感到内疚,以标记我自己的答案是正确的:D – Nacho 2010-03-11 11:48:20

+0

尝试https://gist.github.com/ratskin/ca64cdec852db0374e5a180347d1badc – ratskin 2018-01-29 15:30:25

1

感谢您对@Ned的澄清。 找到完整的说明here

基本上是:

“==”可以作为“价值平等”来理解,即,如果两个事情看起来 相同,==应该返回真值。 (对于那些使用Java 背景,Python的==其实就是做一个类似于一个equals()方法 方法。)

“是”可以被认为是“对象 身份”,即,如果两个事实上 实际上是相同的对象。

-2
#initialize 
r = request.GET 
rg = request.GET.get 

#write simply as below 
if r.has_key('q') and rg('q') != '': 
    #process