2010-03-11 26 views
23

Hola, me estoy metiendo en django y esto me está dando dolor de cabeza. Estoy tratando de obtener una variable GET simple. URL es site.com/search/?q=search-termCómo comprobar si request.GET var es None?

Mi opinión es:

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

Las consultas de búsqueda como: mysite.com/search/? (sin q) pasa el primero si es correcto.

El problema está en consultas como mysite.com/search/?q=. No quedan atrapados por si q no es ninguno:

Entonces, la respuesta breve sería ¿Cómo puedo verificar q == ''? (Ya he intentado '', ninguno, etc., fue en vano.)

+0

Un simple ** if q ** en lugar de ** si q no es None (o '') ** hizo el truco. Alguien tiene una explicación para esto? – Nacho

+2

En general, debe tener mucho cuidado al usar el operador 'is' en Python. Normalmente quiere una prueba de igualdad ('=='), no una prueba de identidad ('es'). Una secuencia de pruebas de longitud no nula 'Verdadero '. –

Respuesta

33

Primero, verifica si el request.GET dict contiene un parámetro llamado q. Estás haciendo esto correctamente ya:

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

A continuación, compruebe si el valor de q es bien None o la cadena vacía. Para hacer eso, usted puede escribir esto:

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

en cuenta que no es necesario escribir request.GET.get('q', None). Ya hemos verificado para asegurarnos de que hay una clave 'q' dentro del dict request.GET, por lo que podemos tomar el valor directamente. La única vez que debe usar el método get es si no está seguro de que un dict tenga determinada clave y desea evitar la generación de una excepción KeyError.

Sin embargo, hay una solución aún mejor en base a los siguientes hechos:

  • El valor None evalúa a False
  • La cadena vacía '' evalúa también a False
  • Cualquier evalúa cadena no vacía a True.

Así que ahora puede escribir:

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

Ver estos otros recursos para más detalles:

+0

Gracias, esta es una gran información. Además, me estaba sintiendo culpable de marcar mi propia respuesta como correcta: D – Nacho

+0

Trate https://gist.github.com/ratskin/ca64cdec852db0374e5a180347d1badc – ratskin

1

Gracias por la aclaración por @Ned. Encontró una explicación completa here.

Básicamente:

'==' puede ser considerado como "valor de la igualdad", es decir, si dos cosas se ven la misma, == debería devolver un valor verdadero. (Para aquellos con un fondo de Java , == de Python está haciendo algo similar a un signo de igual() método.)

'se' puede ser pensado como 'objeto identidad', es decir, si los dos cosas en realidad son el mismo objeto.

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

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