Я хочу сделать фильтр типа checkbox для элементов электронной коммерции.
У меня есть простая электронная коммерция, где я хочу фильтровать товары. Это будет сделано в чекбоксе формы, но категории формы создаются пользователем, т.е. это "for" из Cor.objects.all() . Фильтр работает только для последнего выбранного цвета. Поэтому я хотел, чтобы он имел несколько фильтров.
index.html:
<div class="widgets-item">
<form id="widgets-checkbox-form" action="{% url 'carro_filtro' %}" method="GET">
<ul class="widgets-checkbox">
{% for cor in cores %}
<li>
<input class="input-checkbox" type="checkbox" id="color-selection-{{ cor.id }}" name="termo" value="{{ cor.nome_cor }}">
<label class="label-checkbox mb-0" for="color-selection-{{ cor.id }}">
{{ cor.nome_cor }}
</label>
</li>
{% endfor %}
</ul>
<input type="submit" class="btn btn-custom-size lg-size btn-primary w-100 mb-5 mt-5" value="Filtrar">
</form>
</div>
urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.CarView.as_view(), name='shop'),
path('filtro/', views.CarroFiltro.as_view(), name='carro_filtro'),
]
views.py
class CarView(ListView):
model = Car
template_name = 'shop/index.html'
paginate_by = 12
context_object_name = 'cars'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['personalizacoes'] = Shop.objects.filter(
publicado_shop=True).order_by('-id').first()
context['categorias'] = Categoria.objects.all()
context['cores'] = Cor.objects.all()
return context
def get_queryset(self):
qs = super().get_queryset()
categoria = self.kwargs.get('nome_categoria', None)
if not categoria:
qs = qs.filter(publicado=True).order_by('-id')
return qs
qs = qs.filter(
categoria_carro__nome_categoria__iexact=categoria, publicado=True).order_by('-id')
return qs
class CarroFiltro(CarView):
def get_queryset(self):
qs = super().get_queryset()
color_selection = self.request.GET.get('termo')
print("X"*100)
print(color_selection)
print("X"*100)
if not color_selection or color_selection is None:
return qs
qs = qs.filter(
Q(modelo__icontains=color_selection) |
Q(marca__nome_marca__icontains=color_selection) |
Q(ano__icontains=color_selection) |
Q(cor__nome_cor__icontains=color_selection) |
Q(quilometragem__icontains=color_selection) |
Q(motorizacao__icontains=color_selection) |
Q(cambio__nome_cambio__icontains=color_selection) |
Q(categoria_carro__nome_categoria__icontains=color_selection)
)
return qs
Я хочу сделать несколько фильтров. В представлении "CarroFiltro" я вывел GET, но в нем выбран только последний флажок. Я хочу, чтобы были выбраны все чекбоксы.