Подтвердить что ты не робот

Как проверить, является ли request.GET var None?

Эй, я попадаю в джанго, и это вызывает у меня головную боль. Я пытаюсь получить простую переменную GET. URL-адрес 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:
    ...

Поисковые запросы: mysite.com/search/? (без q) проходит правильно, если правильно.

Проблема заключается в запросах типа mysite.com/search/?q =. Они не попадают, если q не является None:

Итак, короткий ответ: Как проверить q == ''? (Я уже пробовал '', None и т.д., Безрезультатно.

4b9b3361

Ответ 1

Сначала проверьте, содержит ли параметр 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 dict есть ключ 'q', поэтому мы можем напрямую получить значение. Единственный раз, когда вы должны использовать метод get, - это если вы не уверены, что у dict есть определенный ключ и вы хотите избежать повышения исключения KeyError.

Однако существует еще лучшее решение, основанное на следующих фактах:

  • Значение None оценивается как False
  • Пустая строка '' также оценивается как False
  • Любая непустая строка оценивается как True.

Итак, теперь вы можете написать:

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

Дополнительные сведения см. в этих других ресурсах:

Ответ 2

Спасибо за разъяснение @Ned. Нашли полное объяснение здесь.

В принципе:

'==' можно рассматривать как "равноценность ценности", то есть, если две вещи выглядят то же, == должно возвращать истинное значение. (Для тех, у кого есть Java background, Python == на самом деле делает что-то похожее на equals() Метод.)

'is' можно рассматривать как объект идентичность ", то есть, если две вещи фактически являются одним и тем же объектом.

Ответ 3

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

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