Django_筛选器将参数(选项)传递给FilterSet

2024-06-24 12:55:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在与Django建立一个电子商务网站。我正在努力使用django_过滤器。我有模型类别、子类别和产品。当用户访问类别页面时,我希望根据该类别呈现产品品牌过滤器。例如,如果用户访问手机类别,我希望呈现品牌过滤器:苹果、三星、小米等。我实现了类似的效果,但缺点是它显示了所有品牌(与类别无关的产品品牌):佳能、三星、苹果、,博世等,所以我试图查询与该类别相关的产品品牌,并将其作为选择传递给Filterset。如何将品牌选择从view传递到FilterSet

#===模型。py=

class Category(models.Model):
    title = models.CharField(max_length=30, verbose_name=_('Названия'))
    slug = models.SlugField(null=False, unique=True)
    image = models.ImageField(blank=True, upload_to='category_images/', verbose_name=_('Основное фото'))
    created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('Добавлено в'))
    updated_at = models.DateTimeField(auto_now=True, verbose_name=_('Изменено в'))

class Subcategory(models.Model):
    category = models.ForeignKey(Category, related_name='subcategories', null=True, blank=True, on_delete=models.SET_NULL, verbose_name=_('Категория'))
    title = models.CharField(max_length=150, blank=True, verbose_name=_('Названия'))
    image = models.ImageField(blank=True, upload_to='subcategory_images/', verbose_name=_('Основное фото'))
    slug = models.SlugField(max_length=150, unique=True)
    created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('Добавлено в'))
    updated_at = models.DateTimeField(auto_now=True, verbose_name=_('Изменено в'))

class Product(models.Model):
    recommended_choices = (('YES', 'ДА'), ('NO', 'НЕТ'))
    title = models.CharField(max_length=200, blank=True, verbose_name=_('Названия'))
    category = models.ForeignKey(Category, related_name='category_items', on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('Категория'))
    subcategory = models.ForeignKey(Subcategory, related_name='subcategory_items', on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('Подкатегория'))  
    price = models.DecimalField(max_digits=8, decimal_places=2,blank=True, verbose_name=_('Цена'))
    brand = models.CharField(max_length=100,blank=True, verbose_name=_('Бренд'))

#===过滤器。py===

class ProductFilter(django_filters.FilterSet):

    price = django_filters.RangeFilter(widget=django_filters.widgets.RangeWidget(attrs={'class' : 'range_filter', 'type' : 'hidden'}))
    brand = django_filters.AllValuesMultipleFilter(field_name='brand', widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Product
        fields = ['brand', 'price']

#===视图。py===

def category(request, category_slug):
    category = Category.objects.get(slug=category_slug)
    category_title = category.title
    filtered_products = ProductFilter(request.GET, queryset=Product.objects.filter(category=category))
    paginated_filtered_products = Paginator(filtered_products.qs, 28)
    page_number = request.GET.get('page')
    products_page = paginated_filtered_products.get_page(page_number)
    context = {'filtered_products' : filtered_products, 'products_page' : products_page, 'category_title' : category_title}
    return render(request, 'home/products.html', context)


def subcategory(request, category_slug, subcategory_slug):
    subcategory = Subcategory.objects.get(slug=subcategory_slug)
    subcategory_title = subcategory.title
    current_category = subcategory.category
    filtered_products = ProductFilter(request.GET, queryset=Product.objects.filter(subcategory=subcategory))
    paginated_filtered_products = Paginator(filtered_products.qs, 28)
    page_number = request.GET.get('page')
    products_page = paginated_filtered_products.get_page(page_number)
    context = {'filtered_products' : filtered_products, 'products_page' : products_page, 'subcategory_title' : subcategory_title, 'current_category' : current_category}
    return render(request, 'home/products.html', context)

Tags: nametrueverbosetitlemodelsrequestpage类别