Как запросить id категории в другую функцию в views.py
Изучаю Djsngo и четвертый день бьюсь над проблемой. Написал по туториалу кнопку "Load more" для страницы со всеми товарами и решил сделать такую же кнопку для страницы с товарами определенных категорий.
Мои файлы:
views.py
def product_list(request):
total_data = Product.objects.count()
data = Product.objects.all().order_by('-id')[:1]
cats = Product.objects.distinct().values('category__title', 'category__id')
return render(request, 'product_list.html',
{
'data': data,
'cats': cats,
'total_data': total_data,
})
def category_product_list(request, cat_id):
category = Category.objects.get(id=cat_id)
total_data = Product.objects.filter(category=category).count()
data = Product.objects.filter(category=category).order_by('-id')[:1]
return render(request, 'category_product_list.html', {'data': data, 'total_data': total_data, 'category': category})
def load_more_data(request):
offset = int(request.GET['offset'])
limit = int(request.GET['limit'])
data = Product.objects.all().order_by('-id')[offset:offset+limit]
t = render_to_string('ajax/product-list.html', {'data': data})
return JsonResponse({'data': t})
def load_more_dataCat(request):
offset = int(request.GET['offset'])
limit = int(request.GET['limit'])
data = Product.objects.filter(category=2).order_by('-id')[offset:offset+limit]
t = render_to_string('ajax/category_product_list.html', {'data': data})
return JsonResponse({'data': t})
custom.js
$(document).ready(function(){
$("#loadMore").on('click', function(){
var _currentProducts = $(".product-box").length;
var _limit = $(this).attr('data-limit');
var _total = $(this).attr('data-total');
console.log(_total)
// Start Ajax
$.ajax({
url:'/load-more-data',
data:{
limit: _limit,
offset: _currentProducts
},
dataType:'json',
beforeSend:function(){
$("#loadMore").attr('disabled',true);
$(".load-more-icon").addClass('fa-spin');
},
success:function(res){
$("#filteredProducts").append(res.data);
$("#loadMore").attr('disabled',false);
$(".load-more-icon").removeClass('fa-spin');
var _totalShowing = $(".product-box").length;
if(_totalShowing==_total){
$("#loadMore").remove();
}
}
});
// End
});
});
$(document).ready(function() {
$("#loadMoreCat").on('click', function () {
var _currentProducts = $(".product-box").length;
var _limit = $(this).attr('data-limit');
var _total = $(this).attr('data-total');
console.log(_total)
// Start Ajax
$.ajax({
url:'/load-more-dataCat',
data:{
limit: _limit,
offset: _currentProducts
},
dataType:'json',
beforeSend:function(){
$("#loadMoreCat").attr('disabled',true);
$(".load-more-icon").addClass('fa-spin');
},
success:function(res){
$("#categoryProducts").append(res.data);
$("#loadMoreCat").attr('disabled',false);
$(".load-more-icon").removeClass('fa-spin');
var _totalShowing = $(".product-box").length;
if(_totalShowing==_total){
$("#loadMoreCat").remove();
}
}
});
// End
});
});
Я понимаю, что в строке def load_more_dataCat data = Product.objects.filter(category=2).order_by('-id')[offset:offset+limit]
надо, чтобы category в фильтре была равна cat_id, но как ее запросить, я никак не могу сообразить. Из этого же файла views.py он напрямую не берется, говорит, что ее надо объявить. Если записать ее в фильтр вручную, она работает, но справедлива только для одной категории, чью id я вписал, что логично. Как ее сделать динамической?
Я пробовал проводить всякие манипуляции и уже перебрал разные комбинации кода, но так и не нашел решения. Может быть cat_id можно вытянуть из url адреса из urls.py, там она существует в паттерне path('category-product-list/<int:cat_id>', views.category_product_list, name='category-product-list'),
. Пробовал записать так:
def load_more_dataCat(request, cat_id):
offset = int(request.GET['offset'])
limit = int(request.GET['limit'])
category = Category.objects.get(id=cat_id)
data = Product.objects.filter(category=category).order_by('-id')[offset:offset+limit]
t = render_to_string('ajax/category_product_list.html', {'data': data})
return JsonResponse({'data': t})
и так:
data = Product.objects.filter(category=category_product_list()).order_by('-id')[offset:offset+limit]
Но все опробованое не подошло.