Почему мой 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')
Вернуться на верх