Ваше действие формы возвращает вас на ту же страницу, но без category_id
. Это дает вам 404, потому что у вас нет URL-адреса, определенного для 'bike-category/'
. Вам нужно установить действие 'search/'
, или, что еще лучше, использовать шаблонный тег url
с именем вашего пути, например:
<form method="GET" action="{% url 'search' %}">
Это должно устранить ошибку 404, потому что форма должна быть отправлена на 'search/'
, а Django передаст запрос вашему SearchView
классу.
Если вы хотите искать только в категории, вам нужно будет указать SearchView
, какой категория. Вы можете сделать это несколькими способами, но так как вы уже запускаете этот поиск из представления категории, самым простым способом может быть создание нового URL для поиска в категории, но с использованием того же представления:
urlpatterns = [
path('bikes/', BikeView, name='bikes'),
path('', HomeView, name='home'),
path('search/', SearchView, name='search'),
path('search/<category_id>', SearchView, name='category_search'),
path('bike-category/<category_id>', category_view, name='category')
]
Затем вы можете изменить свое представление, чтобы принять это:
def SearchView(request, category_id=None):
if category_id:
category = Category.objects.get(id=category_id)
item_list = Item.objects.filter(category__id=category_id)
else:
category = None
item_list = Item.objects.all()
query = request.GET.get('q')
if query:
item_list = item_list.filter(title__icontains=query)
context = {
'item_list': item_list,
'category': category
}
return render(request, "search.html", context)
Обратите внимание, мы принимаем category_id
в качестве параметра, но присваиваем ему значение по умолчанию None
, так что поиск по категориям все еще работает , Затем мы сначала фильтруем эту категорию, если она была передана. Наконец, мы добавляем запрос к нашему фильтру категорий, фильтруя по item_list
вместо Item.objects
.
Нам также потребуется обновить нашу форму действие для использования этого нового пути:
<form method="GET" action="{% url 'category_search' category.id %}">
И, наконец, нам нужно передать категорию в шаблон search.html
в данных контекста:
def category_view(request, category_id):
category = Category.objects.get(pk=category_id)
item_list = Item.objects.filter(category__pk=category_id)
return render(request, "search.html", {'item_list': item_list, 'category': category})