Как Проверить если запрос. ДОБЕРИТЕСЬ var не Ни один?

Я вхожу в django, и это получает меня головная боль. Я пытаюсь добраться, простое СТАНОВЯТСЯ переменными. 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=. Они не становятся пойманными if q is not None:

Так, короткий ответ был бы То, как я могу проверить q == None? (Я уже попробовал '', None, и т.д., напрасно.)

24
задан MackM 27 February 2019 в 19:23
поделиться

2 ответа

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

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

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

Теперь вы можете написать:

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

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

40
ответ дан 28 November 2019 в 23:37
поделиться

Спасибо за разъяснение от @Ned . Полное объяснение найдено здесь .

В основном:

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

'is' можно рассматривать как 'объект {{1} }} identity ', то есть если две вещи на самом деле являются одним и тем же объектом.

1
ответ дан 28 November 2019 в 23:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: