Django FilterSet设置初始值

时间:2018-01-29 18:43:01

标签: django django-rest-framework django-template-filters

我们在项目中使用Django_Filterset。我被要求为模型

中的外键列设置默认过滤器值
class RegFilter(django_filters.FilterSet):

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

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

2 个答案:

答案 0 :(得分:1)

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

在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产品”。

答案 1 :(得分:0)

我以@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