【问题标题】:Add some parameters to FilterSet (django-filter) + some parameters添加一些参数到FilterSet(django-filter)+一些参数
【发布时间】:2019-10-28 10:49:53
【问题描述】:

我有 3 个模型:

class Category(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=70, null=True, blank=True)

class SubCategory(models.Model):
    category= models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, )

class Products(models.Model):
    user= models.ForeignKey(User, on_delete=models.CASCADE)
    category= models.ForeignKey(Category, on_delete=models.CASCADE)
    subcategory = models.CharField(max_length=200, null=True, blank=True)

我有一个接收requestcategory.slug 的视图

def category_list(request, slug):
    category = Category.objects.get(slug=slug)
    products = ProductFilter(request.GET, queryset=Products.objects.filter(category=category)

    return render(request, 'products/category_list.html', {"products":products, 'category': category})

渲染时我收到一个QuerySet 过滤到Category

我想将category.id 发送到ProductsFilter 并从数据库中接收动态选择

class ProductsFilter(django_filters.FilterSet):
    subcategory= django_filters.ChoiceFilter(lookup_expr='iexact', choices=TEST, required=False)       

    class Meta:
        model = Products
        fields = {
            "subcategory",
        }

想把choices=TEST改成choices=list(SubCategory.objects.filter(category_id=category.id)

这可能吗?

【问题讨论】:

    标签: django django-forms django-filter django-filters


    【解决方案1】:

    您可以在FilterSet.__init__ 方法中处理此问题。类似下面的东西(注意我没有测试过,可能需要一些摆弄):

    class ProductsFilter(django_filters.FilterSet):
        subcategory= django_filters.ChoiceFilter(lookup_expr='iexact', choices=[], required=False)
    
        def __init__(self, category, *args, **kwargs):
            super(ProductsFilter, self).__init__(*args, **kwargs)
    
            choices = self.fields['subcategory'].extra['choices']
            choices += [
                (subcat.name, subcat.name) for subcat 
                in SubCategory.objects.filter(category=category)
            ]
    
        class Meta:
            model = Products
    

    【讨论】:

      【解决方案2】:

      @Sherpa 的回答只有两个小问题。首先,您应该将fields 替换为filters。其次,不能使用+=操作符,必须直接赋值给过滤器的extra。 这是我的工作代码有两种不同的方式

      class LayoutFilterView(filters.FilterSet):
          supplier = filters.ChoiceFilter(
              label=_('Supplier'), empty_label=_("All Suppliers"),)
      
          def __init__(self, *args, **kwargs):
              super(LayoutFilterView, self).__init__(*args, **kwargs)
      
              # First Method
              self.filters['supplier'].extra['choices'] = [
                  (supplier.id, supplier.name) for supplier in ourSuppliers(request=self.request)
              ]
      
              # Second Method
              self.filters['supplier'].extra.update({
                  'choices': [(supplier.id, supplier.name) for supplier in ourSuppliers(request=self.request)]
              })
      

      原帖here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-29
        • 2011-01-03
        • 1970-01-01
        • 2022-11-25
        • 2021-11-28
        • 1970-01-01
        • 2014-04-07
        相关资源
        最近更新 更多