Есть две формы 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'),
]