Я не совсем понимаю, как правильно переопределить get_queryset. Я хочу отобразить все категории, используя Product.objects.filter (availableible = True), но при нажатии отобразить продукты, относящиеся к соответствующей категории. Я прочитал это руководство , но мне все еще нужна помощь. Старая версия представлений, основанная на функциях:
# views
def product_list(request, category_slug=None):
category = None
categories = Category.objects.all()
products = Product.objects.filter(available=True)
if category_slug:
category = get_object_or_404(Category, slug=category_slug)
products = products.filter(category=category)
return render(request,
'shop/product/list.html',
{'category': category,
'categories': categories,
'products': products})
Новая версия на основе generi c .ListView:
class ProductView(generic.ListView):
categories = Category.objects.all()
def get_queryset(self):
self.category = Category.objects.filter(**Here I don't know wright code**)
return Product.objects.filter(available=True)
def get_context_data(self, **kwargs):
context = super(ProductView, self).get_context_data(**kwargs)
context['categories'] = self.categories
#context['category'] = self.category
# urls
urlpatterns = [
path('', views.ProductView.as_view(), name='products'),
path('categories/<slug:category_slug>/',
views.ProductView.as_view(),
name='product_list_by_categories'),]
И html:
<h1>{% if category %}{{ category.name }}{% else %}Products{% endif %}</h1>
...