Django_filters仅在存在?page = 1时才具有初始值

时间:2018-06-29 07:03:18

标签: django django-forms django-templates django-filter django-tables2

我有一个视图AccoutList,该视图试图呈现django_table2表。视图的源代码:

class AccountList(SingleTableMixin, FilterView):
    model = Account
    table_class = AccountTable
    template_name = 'accounts/account_list.html'
    context_table_name = 'object_list'
    ordering = ['vps']

    filterset_class = AccountFilter

此视图当前正在使用此过滤器集(来自django_filters):

import django_filters
from accounts.models import Account

class AccountFilter(django_filters.FilterSet):
    class Meta:
        model = Account
        fields = ['is_suspended', 'is_abandoned']

    is_suspended = django_filters.BooleanFilter(name='is_suspended', initial='False')
    is_abandoned = django_filters.BooleanFilter(name='is_abandoned', initial='False')

    def __init__(self, data=None, *args, **kwargs):
        # if filterset is bound, use initial values as defaults
        if data is not None:
            # get a mutable copy of the QueryDict
            data = data.copy()

            for name, f in self.base_filters.items():
                initial = f.extra.get('initial')

                # filter param is either missing or empty, use initial as default
                if not data.get(name) and initial:
                    data[name] = initial

        super().__init__(data, *args, **kwargs)

使用此模板:

{% if filter %}
    <form action="" method="get" class="form form-inline">
        {{ filter.form.as_p }}
        <input type="submit" />
    </form>
{% endif %}

{% render_table object_list %}

{% endblock %}

这是我的urls.py中的

path('', login_required(AccountList.as_view())),

当我访问页面127.0.0.1:8000时,发现未设置过滤器: enter image description here

但是如果我执行127.0.0.1:8000?page=1,我会看到过滤器已正确初始化:

enter image description here

当我的URL中未附加page = 1时,是什么导致我的过滤器没有默认值的?

1 个答案:

答案 0 :(得分:0)

BooleanFilter的初始值应为布尔值,而不是字符串:

is_suspended = django_filters.BooleanFilter(name='is_suspended', initial=False)
is_abandoned = django_filters.BooleanFilter(name='is_abandoned', initial=False)