如何使用Django Filters添加初始值/默认值?

时间:2016-10-03 14:02:04

标签: python django

使用Django Filters时如何添加初始值/默认值?

例如,像initial=False

这样的东西
class UserFilter(django_filters.FilterSet):
    archive = django_filters.BooleanFilter(initial=False)

    class Meta:
         model = User
         fields = ['archive']

我已经厌倦了覆盖__init__,但这似乎不起作用。

5 个答案:

答案 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尚未正式支持它。