Почему мой else clause не работает в Django?
Я пытаюсь создать ошибку поиска для моего сайта электронной коммерции. Когда пользователь вводит поиск, которого нет в базе данных, он должен возвращать страницу ошибки поиска. Однако, похоже, что мое условие else не работает.
Я пытался вставить else clause в страницу search.html, но она продолжает выдавать мне ошибки, и кажется, что когда я пытаюсь исправить ошибки, ничего не происходит, все остается по-прежнему. Я ожидаю, что страница search_error.html будет появляться, когда пользователь вводит название товара, которого нет в базе данных. Но я продолжаю получать, например, когда я ввожу "hello", появляется страница с "Search results for hello". Но в результате должна появиться страница search_error.html. Я также пробовал в настоящее время использовать else clause в моем views.py, но он показывает то же самое. Я думаю, что мое предложение else не работает, и я не знаю почему.
Мой views.py:
def search(request):
if 'searched' in request.GET:
searched = request.GET['searched']
products = Product.objects.filter(title__icontains=searched)
return render(request, 'epharmacyweb/search.html', {'searched': searched, 'products': products})
else:
return render(request, 'epharmacyweb/search_error.html')
def search_error(request):
return render(request, 'epharmacyweb/search_error.html')
Мой urls.py под URLPatterns:
path('search/', views.search, name='search'),
path('search_error/', views.search_error, name='search_error'),
Моя страница search.html:
{% if searched %}
<div class="pb-3 h3">Search Results for {{ searched }}</div>
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-5 g-3">
{% for product in products %}
<div class="col">
<div class="card shadow-sm">
<img class="img-fluid" alt="Responsive image" src="{{ product.image.url }}">
<div class="card-body">
<p class="card-text">
<a class="text-dark text-decoration-none" href="{{ product.get_absolute_url }}">{{ product.title }}</a>
</p>
<div class="d-flex justify-content-between align-items-center">
<small class="text-muted"></small>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<br></br>
{% else %}
<h1>You haven't searched anything yet...</h1>
{% endif %}
Я думаю, вы хотите проверить, возвращает ли products = Product.objects.filter(title__icontains=searched)
результаты, вместо того, чтобы проверять, есть ли "searched" в аргументах GET
.
Чтобы проверить, вернула ли база данных результаты, вы можете exists()
https://docs.djangoproject.com/en/4.1/ref/models/querysets/#django.db.models.query.QuerySet.exists
Ваш if
возвращает true, потому что термин 'searched'
действительно находится в словаре request.GET
. Это не означает, что в вашей базе данных есть продукт со значением request.GET['searched']
, которое может быть "hello", когда вы набираете "hello". request.GET
- это словарь с ключом размером 'searched'
и значением "hello". Вы также можете использовать get()
, который либо получит значение request['searched']
, либо вернет None
, так что вам совсем не обязательно проверять его с помощью if.
Теперь, чтобы проверить, есть ли в базе данных значение поискового термина, можно проверить queryset:
def search(request):
# Return the value or None
searched = request.GET.get('searched')
products = Product.objects.filter(title__icontains=searched)
# Check if there are any products with the search term:
if products:
return render(request, 'epharmacyweb/search.html', {'searched': searched, 'products': products})
else:
return render(request, 'epharmacyweb/search_error.html')