Я вхожу в 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
, и т.д., напрасно.)
Сначала проверьте, содержит ли 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
Дополнительные сведения см. В других ресурсах:
Спасибо за разъяснение от @Ned . Полное объяснение найдено здесь .
В основном:
'==' можно рассматривать как «равенство значений», то есть, если две вещи выглядят одинаково, == должно возвращать истинное значение. (Для тех, кто имеет опыт работы с Java , Python == фактически делает что-то вроде метода equals () .)
'is' можно рассматривать как 'объект {{1} }} identity ', то есть если две вещи на самом деле являются одним и тем же объектом.