首页 > 解决方案 > Django_filters 仅在存在 ?page=1 时才具有初始值

问题描述

我有一个视图,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,我看到未设置过滤器: 在此处输入图像描述

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

在此处输入图像描述

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

标签: djangodjango-formsdjango-templatesdjango-filterdjango-tables2

解决方案


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

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

推荐阅读