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
我们正在项目中使用 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