Фильтрация по заголовку внутри категории (многие ко многим) - PullRequest
1 голос
/ 12 февраля 2020

У меня есть страница, на которой я могу выбрать категорию своего товара, затем он переходит к другому шаблону и отображает все товары с этой категорией. Что нужно сделать, чтобы я мог отфильтровать эти результаты, скажем, по названию?

views.py - это функция, которая фильтрует мои товары по категориям и переводит меня на поиск. html template

def category_view(request, category_id):
  item_list = Item.objects.filter(category__pk=category_id)

  return render(request, "search.html", {'item_list': item_list})

search. html

    <div class="offset-md-1 col-md-2">
    <h2>Content Filter</h2> <br>
    <form method="GET" action=".">
        <div class="form-row">
            <div class="form-group col-12">
                <div class="input-group">
                    <input class="form-control py-2 border-right-0 border" type="search" name="q"
                        placeholder="Brand..">
                    <span class="input-group-append">
                        <div class="input-group-text bg-transparent">
                            <i class="fa fa-search"></i>
                        </div>
                    </span>
                </div>
            </div>
        </div>
</div>

Ниже приведен только список, в котором отображаются результаты

views.py Я пытался сделать это таким образом, но я получаю сообщение об ошибке «Страница не найдена (404)» «Текущий путь, велосипед-категория /, не соответствует ни одному из них. "

def SearchView(request):
  item_list = Item.objects.all()
  query = request.GET.get('q')
  if query:
      item_list = Item.objects.filter(title__icontains=query)

  context = {
      'item_list': item_list
  }
  return render(request, "search.html", context)

urls:

urlpatterns = [
   path('bikes/', BikeView, name='bikes'),
   path('', HomeView, name='home'),
   path('search/', SearchView, name='search'),
   path('bike-category/<category_id>', category_view, name='category')
]

1 Ответ

1 голос
/ 12 февраля 2020

Ваше действие формы возвращает вас на ту же страницу, но без 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...