使用Django Filters时如何添加初始值/默认值?
例如,像initial=False
class UserFilter(django_filters.FilterSet):
archive = django_filters.BooleanFilter(initial=False)
class Meta:
model = User
fields = ['archive']
我已经厌倦了覆盖__init__
,但这似乎不起作用。
答案 0 :(得分:2)
您可以尝试覆盖__init__
的{{1}}方法:
UserFilter
答案 1 :(得分:0)
对于DRF,您可以尝试覆盖__init__
:
def __init__(self, *args, **kwargs):
kwargs['data']._mutable = True
if 'archive' not in kwargs['data']:
kwargs['data']['archive'] = False
kwargs['data']._mutable = False
super(UserFilter, self).__init__(*args, **kwargs)
但是您应该阅读django-filter.readthedocs.io...using-initial-values-as-defaults
答案 2 :(得分:0)
我有一个类似的问题,即使在用户离开页面后,我也希望保留用户的选择。我在“过滤器视图”中实现了我的解决方案,如下所示...
class BucketLookupView(UserPassesTestMixin,SingleTableMixin,FilterView):
template_name = "finance/planning-bucket-lookup.html"
model = finance_models.SalesOrderBucket
filterset_class = finance_filters.BucketFilter
table_class = finance_tables.BucketTable
def get_filterset_kwargs(self,*args):
kwargs = super().get_filterset_kwargs(*args)
if kwargs['data']:
bucket_filter_data = kwargs['data']
self.request.session['bucket_filter_data']= bucket_filter_data
else:
if 'bucket_filter_data' in self.request.session.keys():
kwargs['data']=self.request.session['bucket_filter_data']
return kwargs
答案 3 :(得分:0)
这是我使用的近似代码段:
def list(self, request, *args, **kwargs):
filters = QueryDict('is_archive=true', mutable=True)
filters.update(request.GET)
您根据请求构建一个新的QueryDict。GET是不可变的。效率不高,但对我来说看起来很漂亮。
答案 4 :(得分:0)
这里是@IlyaPetukhov的答案的混音,我觉得它更容易阅读:
def __init__(self, data=None, *args, **kwargs):
if data is not None:
data = data.copy()
data.setdefault("archive", False)
super(UserFilter, self).__init__(data, *args, **kwargs)
如果您对data = data.copy()
不满意,可以将其替换为data._mutable = True
;只是知道Django尚未正式支持它。