Как проверить, является ли 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 и т.д., Безрезультатно.
Ответы
Ответ 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