Задать вопрос
@zitSuccess

Как отфильтровать по цене и рубрикам одновременно?

Есть две формы html для фильтрации продукции: по цене, по рубрикам и типу товара. Как сделать так, чтобы можно было фильтровать одновременно по рубрикам и цене. Все работает, но когда фильтрую по цене - сбивается фильтр рубрики и наоборот. Пробовал через кастомный тег это сделать, но ничего не получилось.

P.s. Делал все в одной форме - получается баговано. Eсли не указать цену товара и попытаться отфильтровать по рубрике - выдает ошибку. Дефолтные значения тоже выставлял, работало чуть лучше, но тоже не без багов

views.py
class ProductList(ListView):
    """Отображение продуктов"""
    model = Product
    template_name = 'catalog/product_list.html'
    paginate_by = 2

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(*kwargs)
        context['products'] = Product.objects.filter(is_available=True)
        context['max_price'] = self.get_queryset().order_by('-price').first()
        context['min_price'] = self.get_queryset().order_by('price').first()
        return context


class ProductListFilter(ListView):
    """Отображение отфильтрованных продуктов"""
    model = Product
    template_name = 'catalog/product_list.html'
    paginate_by = 2

    def get_queryset(self):
        return Product.objects.filter(
            Q(type_of_product__slug__in=self.request.GET.getlist('type')) |
            Q(rubric__slug__in=self.request.GET.getlist('rubric')) |
            Q(price__range=(self.request.GET.get('min_price'), self.request.GET.get('max_price')))
        ).distinct()

    def get_context_data(self, *, object_list=None, **kwargs):
        context = super().get_context_data(**kwargs)
        context['max_price'] = self.get_queryset().order_by('-price').first()
        context['min_price'] = self.get_queryset().order_by('price').first()
        return context

Повторяющийся код в контексте потом уберу))

html
<div class="h-100">
            <!--Filter block-->
                <form class="filter-form " action="{% url 'catalog_filter' %}" method="get">
                    <table>
                        <tbody>
                            <!-- Product filter by type-->
                            <tr class="form-filter-tr">
                                <td class="form-filter-td"><h5 class="fw-bolder">Тип товара:</h5></td>
                                {% for type in types %}
                                <td class="form-filter-td">
                                    <input type="checkbox" name="type" value="{{ type.slug }}">
                                    <span class="filter-checkbox-span">{{ type.name }}</span>
                                </td>
                                {% endfor %}
                            </tr>

                            <!-- Product filter by rubric-->
                            <tr class="form-filter-tr">
                                <td class="form-filter-td"><h5 class="fw-bolder">Жанр:</h5></td>
                                {% for rubric in rubrics %}
                                <td class="form-filter-td">
                                    <input type="checkbox" name="rubric" value="{{ rubric.slug }}">
                                    <span class="filter-checkbox-span">{{ rubric.name }}</span>
                                </td>
                                {% endfor %}
                            </tr>
                        </tbody>
                    </table>
                    <button type="submit" class="btn btn-outline-dark filter-form-btn">Применить фильтр</button>
                    <a href="{% url 'catalog' %}" class="btn btn-outline-dark filter-form-btn">Сбросить фильтры</a>
                </form>
                <!-- Product filter table-->

                <!-- Product filter by price-->
                <form class="filter-form mt-3" action="{% url 'catalog_filter' %}" method="get">
                    <table>
                        <tbody>

                             <tr class="form-filter-tr">
                                <td class="form-filter-td"><h5 class="fw-bolder">Цена:</h5></td>
                                <td class="form-filter-td-price">
                                    <input class="form-filter-price" type="text" name="min_price" placeholder="{{ min_price.price }}">
                                </td>
                                <td class="form-filter-td-price">
                                    <input class="form-filter-price" type="text" name="max_price" placeholder="{{ max_price.price }}" >
                                </td>
                            </tr>
                        </tbody>
                    </table>
                    <button type="submit" class="btn btn-outline-dark filter-form-btn">Ок</button>
                </form>
            </div>


urls.py
urlpatterns = [
    path('catalog/', views.ProductList.as_view(), name='catalog'),
    path('filter/', views.ProductListFilter.as_view(), name='catalog_filter'),

    path('<str:slug>', views.ProductDetail.as_view(), name='product_detail'),
]
  • Вопрос задан
  • 118 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы