Как отобразить набор запросов на основе категории, связанной с запрашиваемым слагом? - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь отобразить наборы запросов, связанные с определенной категорией, на основе запрошенного фрагмента веб-страницы. Я учусь в школе и пытаюсь изучить фреймворк Django.

Вот пример, который я попробовал:

class ProductCategoryListView(ListView):
    template_name = 'products/product_list.html'

    def get_queryset(request, *args, **kwargs):
        if Product.category == ProductCategory.title:
            instance = ProductCategory.objects.get(title=instance)
            post = Product.objects.filter(category=instance)
            return post

А вот мои модели:

class ProductCategory(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    parent = models.ForeignKey('self', blank=True, null=True,
                related_name='children', on_delete=models.PROTECT)

class Product(models.Model):
    title       = models.CharField(max_length=100)
    category    = models.ForeignKey(ProductCategory, null=True, blank=True,
                    on_delete=models.CASCADE)
    slug        = models.SlugField(blank=True)
    description = models.TextField()
    price       = models.DecimalField(decimal_places=2, max_digits=6)
    image       = models.ImageField(upload_to='products/', null=True, blank=True)

Это представление загружало веб-страницу, но не отображало никаких запросов.

1 Ответ

0 голосов
/ 08 октября 2019

Предполагая, что слаг относится к категории, вы можете сделать это:

from django.shortcuts import get_object_or_404


class ProductCategoryListView(ListView):
    template_name = 'products/product_list.html'

    def get_queryset(request, *args, **kwargs):
        category = get_object_or_404(Category, slug=self.slug)
        products = Product.objects.filter(category=category)
        return products

В вашей модели Product вы можете установить related_name в поле категории, чтобы было легче получить доступ к продуктам изкатегория:

class Product(models.Model):
    title       = models.CharField(max_length=100)
    category    = models.ForeignKey(
        ProductCategory, null=True, blank=True, related_name="products", on_delete=models.CASCADE
    )
    ...

Теперь вы можете сделать это:

from django.shortcuts import get_object_or_404


class ProductCategoryListView(ListView):
    template_name = 'products/product_list.html'

    def get_queryset(request, *args, **kwargs):
        category = get_object_or_404(Category, slug=self.slug)
        return category.products.all()
...