Django FilterSet 设置初始值

Django FilterSet set initial value

我们正在项目中使用 Django_Filterset。我被要求为模型中的外键列设置默认过滤器值

class RegFilter(django_filters.FilterSet):

    class Meta:
        model = models.Reg
        fields = {
          'id': ['exact'],
          'nom_id': ['icontains'],
          'nom_name': ['icontains'],
          'product__name': ['icontains']
        }

显示初始屏幕时,产品名称应默认为数据库中已有的产品 - 知道如何实现吗?感谢您的帮助。

我设法解决了这个问题,并认为该解决方案可能会帮助处于与我类似情况的其他人。

在views.py中重写FilterView方法

def get_filterset_kwargs(self, filterset_class):
    kwargs = super(RegFilter, self).get_filterset_kwargs(filterset_class)
    if kwargs['data'] is None:
        request_dict = {}
    else:
        request_dict = kwargs['data'].dict()

    # This default will not be populated if any other filter options are chosen to restrict the query set
    if not request_dict:
        request_dict.update({
            'product__name': 'ABC Product'
        })

    request_dict = kwargs['data']

    return kwargs

当没有传递其他选项来限制获取的数据时,现在应该将默认产品设置为 'ABC product'。

我以@Gayathri 给出的答案为基础,修复了一些小问题。他的代码中有一个拼写错误,并且该代码不适用于多选字段,因为它们需要 MultiValueDict 功能用于多个条目。

给出一个相当常规的视图,这里是完整的代码(在 Python3 语法中):

class BookListView(FilterView):
    model = Book
    filterset_class = BookFilter

    def get_filterset_kwargs(self, filterset_class):
        kwargs = super().get_filterset_kwargs(filterset_class)
        if kwargs['data'] is None:
            filter_values = MultiValueDict()
        else:
            filter_values = kwargs['data'].copy()

        if not filter_values:
            # we need to use `setlist` for multi-valued fields to emulate this coming from a query dict
            filter_values.setlist('status', ['new', 'ready'])
            filter_values['sorting'] = '-created'

        kwargs['data'] = filter_values

        return kwargs