首页 > 解决方案 > 如何在 django 中按品牌或类别过滤产品

问题描述

我正在开发一个 Django 博客,我希望能够按类别或品牌过滤产品。

**Page not found (404)**

**Request Method:   GET**

**Request URL:  http://127.0.0.1:8000/nestle/**

**Raised by:    shop.views.product_list**

**No Category matches the given query.**

该代码适用于单个实例,但当我尝试同时使用两个实例时失败。即,如果我应该评论品牌或类别,代码运行良好,但两者不能一起工作。

**请求 URL: http: //127.0.0.1 : 8000/nestle/ ** -- 雀巢是一个品牌,但引发的错误是No Category 与给定查询匹配。. 我希望它按品牌而不是按类别过滤

这是我的views.py 文件

def product_list(request,  category_slug=None, brand_slug=None):
   category = None
   categories = Category.objects.all()
   products = Product.objects.filter(available=True)

   brand = None
   brands = Brand.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)


    elif brand_slug:
       brand = get_object_or_404(Brand, slug=brand_slug)
       products = products.filter(brand=brand)
   


    return render(request,
       'shop/product/list.html',
       {'category': category,
       'categories': categories,
       'brand': brand,
       'brands': brands,
       'products': products})

这是我的模型.py

from django.urls import reverse

class Category(models.Model):
    name = models.CharField(max_length=200,db_index=True)
    slug = models.SlugField(max_length=200,unique=True)
    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'
    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return reverse('shop:product_list_by_category',args=[self.slug])


class Brand(models.Model):
    name = models.CharField(max_length=200,db_index=True)
    slug = models.SlugField(max_length=200,unique=True)
    class Meta:
        ordering = ('name',)
        verbose_name = 'brand'
        verbose_name_plural = 'brands'

    def __str__(self):
        return self.name


    def get_absolute_url(self):
        return reverse('shop:product_list_by_brand',args=[self.slug])


class Product(models.Model):
    category = models.ForeignKey(Category,related_name='products',on_delete=models.CASCADE)
    brand = models.ForeignKey(Brand,related_name='products',on_delete=models.CASCADE)
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d',blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)


    def __str__(self):
        return self.name


    def get_absolute_url(self):
        return reverse('shop:product_detail',args=[self.id, self.slug]) 

有人能帮我吗?抱歉,我是新手,正在尝试通过教程学习。谢谢

标签: pythondjango

解决方案


推荐阅读