我们在项目中使用Django_Filterset。我被要求为模型
中的外键列设置默认过滤器值class RegFilter(django_filters.FilterSet):
class Meta:
model = models.Reg
fields = {
'id': ['exact'],
'nom_id': ['icontains'],
'nom_name': ['icontains'],
'product__name': ['icontains']
}
当显示初始屏幕时,产品名称应默认为数据库中已有的产品 - 知道如何实现这一目标?感谢您的帮助。
答案 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