Как проверить, является ли request.GET var None? - PullRequest
24 голосов
/ 11 марта 2010

Я вхожу в Джанго, и у меня болит голова. Я пытаюсь получить простую переменную GET. URL-адрес site.com / search /? Q = критерий поиска

Мой взгляд:

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 = . Их не поймают if q is not None:

Итак, краткий ответ: Как я могу проверить q == None? (Я уже пробовал '', None и т. Д., Но безрезультатно.)

Ответы [ 2 ]

39 голосов
/ 11 марта 2010

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

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

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

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

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

См. Другие ресурсы для получения более подробной информации:

1 голос
/ 11 марта 2010

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

В основном:

'==' можно рассматривать как «равенство значений», то есть, если две вещи выглядятто же самое, == должно возвращать истинное значение.(Для тех, кто имеет опыт работы с Java, Python == фактически делает что-то похожее на метод equals ().)

«is» можно рассматривать как «идентичность объекта», то есть, если две вещина самом деле это один и тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...