Django - Как показать все отфильтрованные продукты с одинаковыми атрибутами в шаблоне, но только один общий атрибут должен быть показан для фильтрации?
Как объединить отфильтрованные результаты с одинаковым значением/именем в один и отобразить все объекты, имеющие эти конкретные значения/имена?
В моем store/views.py я получил следующее:
def filter_data(request):
"""
Using ajax to return products that are being filtered by category.
:param request:
:return:
"""
category_ids = request.GET.getlist('category-id[]')
product_prices = request.GET.getlist('price[]')
variations = request.GET.getlist('variation[]')
if request.session['prod_asc'] == 'ascending':
products = Product.objects.all().filter(is_available=True).order_by(
'created_date').distinct()
else:
products = Product.objects.all().filter(is_available=True).order_by(
'-created_date').distinct()
# Filter products by category
if len(category_ids) > 0:
products = products.filter(category__id__in=category_ids).distinct()
# Filter products by prices
if len(product_prices) > 0:
products = products.filter(price__in=product_prices).distinct()
# Filter products by variations
if len(variations) > 0:
products = products.filter(variation__id__in=variations).distinct()
t = render_to_string('product-list.html', {'data': products[
:AMOUNT_PRODS_SHOW]}) # Default amount of products show for
# filtering products based on category is 99 products
return JsonResponse({'data': t})
В моем js файле я получил следующее:
$(document).ready(function(){
$(".ajaxLoader").hide();
$(".filter-checkbox").on('click', function(){
var _filterObj={};
$(".filter-checkbox").each(function(index,ele){
var _filterVal=$(this).val();
var _filterKey=$(this).data('filter');
_filterObj[_filterKey]=Array.from(document.querySelectorAll('input[data-filter='+_filterKey+']:checked')).map(function(el){
return el.value;
});
});
// Run Ajax
$.ajax({
url:'/store/filter_data',
data:_filterObj,
dataType:'json',
beforeSend:function(){
$(".ajaxLoader").show();
},
success:function(res){
$("#filteredProducts").html(res.data);
$(".ajaxLoader").hide();
}
});
});
});
В моем обычном шаблоне store.html я получил следующее:
<div class="single-widget pb-50 mb-50">
<h4 class="widget-title">Filter By Variation</h4>
<div class="widget-category-list scroll-box-default">
{% for variation in variations|dictsort:"variation_category" %}
<div class="single-widget-category">
<input type="checkbox" data-filter="variation" value="{{ variation.id }}" class="filter-checkbox" id="variation-{{ variation.id }}">
<label for="variation-{{ variation.id }}">{{ variation.variation_value }}
</label>
</div>
{% endfor %}
</div>
</div>
В моем product_list.html, который будет показывать результаты Javascript/Jquery внутри store.html при установке флажков для фильтрации товаров - я получил следующее:
Я хочу иметь возможность показывать продукты с одинаковыми атрибутами, например, если оба продукта имеют одинаковый размер: Medium. Сейчас, как показано на рисунке ниже, мой код выводит список, например, size: Medium дважды, и покупателю нужно дважды отметить флажками поля со значением Medium, чтобы показать два продукта с размером Medium. Суть в том, что я хочу перечислить, например, размер Medium один раз - клиент проверяет поле Medium - все продукты, получившие значение Medium, будут показаны в качестве результатов. Как это сделать с текущим кодом, не изменяя базовые модели?