2010-03-11 12 views
23

Hej, dostaję się do django, a to powoduje ból głowy. Próbuję uzyskać prostą zmienną GET. URL site.com/search/?q=search-termJak sprawdzić, czy request.GET var jest Brak?

Moim zdaniem:

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

Zapytania takie jak: mysite.com/search/? (bez q) przechodzi przez pierwsze, jeśli poprawnie. Problem dotyczy zapytań takich jak mysite.com/search/?q=. Nie zostaną złapani przez , jeśli q nie jest żadną:

Tak więc krótka odpowiedź brzmi: Jak mogę sprawdzić q == ''? (Próbowałem już "", Brak itp., Bezskutecznie.)

+0

Proste ** jeśli q ** zamiast ** jeśli q nie jest Brak (lub '') ** załatwiło sprawę. Ktoś ma wyjaśnienie tego? – Nacho

+2

Ogólnie rzecz biorąc, musisz być bardzo ostrożny w używaniu operatora 'is' w Pythonie. Normalnie potrzebujesz testu równości ('=='), a nie testu tożsamości ('jest'). Sekwencja testów niezerowej długości "True". –

Odpowiedz

33

Po pierwsze, sprawdź, czy request.GET DICT zawiera parametr o nazwie q. Robisz to właściwie już:

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

Następnie należy sprawdzić, czy wartość q jest albo None lub pusty łańcuch. Aby to zrobić, można napisać to:

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

Zauważ, że nie jest konieczne, aby napisać request.GET.get('q', None). Sprawdziliśmy już, aby upewnić się, że istnieje klucz 'q' wewnątrz dyktafonu request.GET, abyśmy mogli pobrać wartość bezpośrednio. Jeśli nie masz pewności, że dict ma określony klucz i chcesz uniknąć zgłoszenia wyjątku KeyError, należy użyć metody get.

Jednak nie jest jeszcze lepsze rozwiązanie oparte na następujących faktach:

  • Wartość None ocenia się False
  • pusty ciąg '' ocenia również False
  • Wszelkie niepuste ocenia strunowe do True.

Więc teraz można napisać:

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

Zobacz te inne zasoby więcej szczegółów:

+0

Dzięki, to jest świetna informacja. Plus, czułem się winny, aby oznaczyć własną odpowiedź jako poprawną: D – Nacho

+0

Spróbuj https://gist.github.com/ratskin/ca64cdec852db0374e5a180347d1badc – ratskin

1

Dzięki za wyjaśnienie przez @Ned. Znaleziono pełne wyjaśnienie here.

Zasadniczo:

„==” mogą być traktowane jako „równości wartości”, to znaczy, jeśli dwie rzeczy wyglądają samo, == powinny powrócić prawdziwą wartość. (Dla tych z Java tle, == Pythona jest rzeczywiście robi coś podobnego do równości() metody.)

„jest” można traktować jako „obiektu tożsamości”, to znaczy, jeśli dwa Rzeczy w rzeczywistości są tym samym obiektem.

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

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