2010-03-11 4 views
23

이봐, 나는 장고에 들어가고있어. 그리고 나에게 두통이 생기고있다. 간단한 GET 변수를 얻으려고합니다.request.GET var가 None인지 확인하는 방법?

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/ URL은

내보기는 site.com/search/?q=search-term입니까? (q 제외)은 첫 번째를 올바르게 통과합니다.

mysite.com/search/?q=과 같은 검색어에 문제가 있습니다. q가 None이 아닌 경우 그들은 에 걸리지 않습니다.

따라서 q == '를 어떻게 확인할 수 있습니까? (나는 이미 '', 아무도 등을 시도해 보지 않았다.)

+0

q가 None (또는 '')이 아닌 ** ** 대신 ** ** ** 단순한 ** 트릭을 수행했습니다. 누구든지 이에 대한 설명이 있습니까? – Nacho

+2

일반적으로 파이썬에서'is' 연산자를 사용하는 것에 대해 매우 신중해야합니다. 일반적으로 동일성 테스트 ('==')가 필요하며 신원 확인 테스트 ('is')가 필요치 않습니다. 길이가 0이 아닌 시퀀스가 ​​'참'입니다. –

답변

33

request.GET dict에 q이라는 매개 변수가 포함되어 있는지 먼저 확인하십시오. 당신은 제대로 이미이 일을하고 있습니다 : q의 값 중 하나를 None 또는 빈 문자열 인 경우

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

다음 확인합니다. 이를 위해, 당신이 쓸 수 있습니다 : request.GET.get('q', None)을 쓸 필요가 없습니다

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

공지있다. request.GET dict 안에 'q' 키가 있는지 확인 했으므로 값을 직접 가져올 수 있습니다. get 메서드를 사용해야하는 유일한 방법은 dict에 특정 키가 있는지 확실하지 않고 KeyError 예외를 발생시키지 않으려는 경우입니다.

  • None는 평가 False
  • ''False
  • 비어 있지 않은 문자열을 평가하여 평가 빈 문자열 :

    그러나, 다음과 같은 사실을 기반으로 더 나은 솔루션이있다 True.그래서

지금 당신은 쓸 수 있습니다 :

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

자세한 내용은 이러한 다른 리소스를 참조하십시오

+0

감사합니다. 좋은 정보입니다. 플러스 : 나는 내 자신의 답변을 올바른 것으로 표시하는 것에 대해 유죄로 생각했습니다. D – Nacho

+0

https://gist.github.com/ratskin/ca64cdec852db0374e5a180347d1badc를 방문하십시오. – ratskin

1

설명해 주셔서 감사합니다. @Ned. 자세한 설명을 찾아보십시오 here. 기본적으로

: 두 가지 같은 보면

'==' '값 평등 "으로 생각 될 수있다, 즉, == true 값을 반환해야한다. (자바 배경을 가진 사람들을 위해, 파이썬의 == 사실) (등호에 방법과 유사한 일을하고 있습니다.)

이 두 경우, 즉 '객체 정체성'으로 간주 할 수 있습니다 '있다' 사실 은 실제로 동일한 개체입니다.

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

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