Django-filter: (2.0) FilterView рд╣рдореЗрд╢рд╛ рдЕрдирдмрд╛рдЙрдВрдб FilterSet рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА QuerySet рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЬреВрди 2018  ┬╖  19рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: carltongibson/django-filter

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рджреГрд╢реНрдп рд╣реИ, AccountList , рдЬреЛ рдПрдХ 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 рдореЗрдВ рдкреГрд╖реНрда=1 рд╕рдВрд▓рдЧреНрди рди рд╣реЛрдиреЗ рдкрд░ рдореЗрд░реЗ рдлрд╝рд┐рд▓реНрдЯрд░реЛрдВ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдирд╣реАрдВ рд╣реЛрдиреЗ рдХрд╛ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИ?

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдВ - рдкреАрдЖрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛рдо рдХреЛ рд░реЛрдХрдирд╛ рдкрдбрд╝рд╛ред рдЬрд╣рд╛рдВ рд╕реЗ рдореИрдВрдиреЗ рдХрд╛рдлреА рдЬрд▓реНрджреА рдЫреЛрдбрд╝рд╛ рдерд╛, рд╡рд╣рд╛рдВ рд╕реЗ рдореИрдВ рдЙрдард╛ рд╕рдХреВрдВрдЧрд╛ред

рд╕рднреА 19 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди 'False' рдмрдЬрд╛рдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ False рдмреВрд▓рд┐рдпрди рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рддреЛ рдЬрдм рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдХреЛрд╢рд┐рд╢ рдХреА:

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдлрд╝рд┐рд▓реНрдЯрд░ 127.0.0.1:8000/ рдкрд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ

image

рднрд▓реЗ рд╣реА рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рд╣реА рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдлрд┐рд░ рднреА рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрднреА рднреА рдирд┐рд▓рдВрдмрд┐рдд рдпрд╛ рдЫреЛрдбрд╝реЗ рдЧрдП рдЦрд╛рддреЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдореИрдВ рдиреАрдЪреЗ 2 рдмрдЯрди рджрдмрд╛рдХрд░ рдкреГрд╖реНрда 2 рдкрд░ рдЬрд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ http://127.0.0.1:8000/?page=2 рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░ Unknown рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

image

рдХреНрдпрд╛ рдЖрдк рдХреЛрдИ рдХрд╛рд░рдг рджреЗрдЦрддреЗ рд╣реИрдВ?

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ - рдХреБрдЫ рднреА рд╕реНрдкрд╖реНрдЯ рджрд┐рдорд╛рдЧ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд░рд┐рдгрд╛рдореА SQL рдХреНрд╡реЗрд░реА рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ suspended рдФрд░ abandoned рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред
рджреВрд╕рд░реЗ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реВрдБрдЧрд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдкреГрд╖реНрда рдмрджрд▓рддреЗ рд╕рдордп suspended рдФрд░ abandoned рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реЛред

рдореИрдВрдиреЗ рдХреБрдЫ рдкреНрд░рд┐рдВрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдбрд╛рд▓реЗ рдФрд░ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓реЗ:

def __init__(self, data=None, *args, **kwargs):
    if data is not None:        # 1
        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(BaseFilterSet, self).__init__(data, *args, **kwargs)

рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ data рд╣реИ None ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдореЗрд░рд╛ рд╡рд░реНрдЧ рдЖрдзрд╛рд░рд┐рдд рджреГрд╢реНрдп data рд╕реЗ AccountFilter рдХреНрдпреЛрдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ?

рд╣рдореНрдоред data рддрд░реНрдХ рд╣рдореЗрд╢рд╛ FilterView рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

https://github.com/carltongibson/django-filter/blob/b1f1c6592ef64a2172ec39040607a9c0b0714140/django_filters/views.py#L39 -L46

рдХреНрдпрд╛ рдкрд╣рд▓реЗ рдФрд░ рджреВрд╕рд░реЗ рджреЛрдиреЛрдВ рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП data рдЦрд╛рд▓реА рд╣реИ?

рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдмрдВрдж рдХрд░рдирд╛ред

2.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣рд╛рдВ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП URL рдореЗрдВ рдпрд╛ рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреГрд╖реНрда рдпрд╛ рдЦрд╛рд▓реА рдлрд╝рд┐рд▓реНрдЯрд░ рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдХрд╣реАрдВ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИ?

рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ...

page ? рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЗ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ, рдмрдЬрд╛рдп Django рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? 2.0 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред 1.1.0 рдкрд░ рдбрд╛рдЙрдирдЧреНрд░реЗрдб рдХрд░рдиреЗ рд╕реЗ рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рджреГрд╢реНрдп рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд╡реНрдпрд╡рд╣рд╛рд░ рдмрдирд╛ рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@moorchegue , рдПрдХ рдиреНрдпреВрдирддрдо рдЙрджрд╛рд╣рд░рдг рдкрд░реАрдХреНрд╖рдг рдХреЗрд╕ рдпрд╛ рдкрд░реАрдХреНрд╖рдг рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╕рд╣рд╛рдпрдХ рд╣реЛрдЧрд╛ред

рдРрд╕рд╛ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдХреБрдЫ рднреА рдЖрдкрдХреЗ рдкреЗрдЬрд┐рдиреЗрд╢рди рддрд░реНрдХ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИ рд╡рд╣ рд╕рдорд╕реНрдпрд╛ рд╣реИред рд╣рд╛рдВ, рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрд╕рдВрдЧрддрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИрдВред рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Django рдлрд╝рд┐рд▓реНрдЯрд░ рдореЗрдВ рдПрдХ рдмрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╕рдорд╕реНрдпрд╛ #788 рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХреА рдЧрдИ is_valid() рдкрджреНрдзрддрд┐ рдХреЗ рд╕рд╛рде рд╣реИред

https://github.com/carltongibson/django-filter/blob/1dde11c70eedeac32f6de92c426deb289e1aebd8/django_filters/filterset.py#L202 -L206

рдпрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ False рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрдм data None ред

рдЙрд╕ рджреГрд╢реНрдп рдореЗрдВ рд╣рдо рдлрд┐рд░ object_list рд╕реЗ qs.none() ред

https://github.com/carltongibson/django-filter/blob/1dde11c70eedeac32f6de92c426deb289e1aebd8/django_filters/views.py#L80 -L83

рдЗрд╕рд▓рд┐рдП рдордирд╛рдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЯреЗрдореНрдкреНрд▓реЗрдЯ filter.qs рдмрдЬрд╛рдп object_list ред

https://github.com/carltongibson/django-filter/blob/1dde11c70eedeac32f6de92c426deb289e1aebd8/tests/templates/tests/book_filter.html#L3 -L5

рддрддреНрдХрд╛рд▓ рдХрд╛рдо рдЖрдкрдХреЗ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдкрд░ strict = False рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдорд╛рдиреНрдп рдлрд╝рд┐рд▓реНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЦрд╛рд▓реА рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдЖрдВрд╢рд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред (рдмреЗрд╣рддрд░ рд╣реИ рджреГрд╢реНрдп рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ get рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрд░реНрдХ ...)

рд╣рдо рдЕрдирдмрд╛рдЙрдВрдб рдХреЗрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВрдЧреЗред

рд╣рдореНрдоред рдпрд╣рд╛рдВ рдкреНрд░рд╛рдердорд┐рдХ рдХрдореА рджреГрд╢реНрдп рдХреЗ object_list рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд╕реЗрдЯ рдХреЗ .qs рдмреАрдЪ рдЕрд╕рдорд╛рдирддрд╛ рд╣реИред рд╕рдЦреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ FilterSet.qs рд╡рд╣ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдбреАрдЖрд░рдПрдл рдмреИрдХрдПрдВрдб рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдЦреНрдд/рдЧреИрд░-рд╕рдЦреНрдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рдЗрд╕реЗ рдорд┐рдЯрд╛ рджреВрдВрдЧрд╛ред

@rpkilby рдХреНрдпрд╛ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рд╣реБрдИ рд╣реИ?

рд╣рд╛рдВ - рдкреАрдЖрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдХрд╛рдо рдХреЛ рд░реЛрдХрдирд╛ рдкрдбрд╝рд╛ред рдЬрд╣рд╛рдВ рд╕реЗ рдореИрдВрдиреЗ рдХрд╛рдлреА рдЬрд▓реНрджреА рдЫреЛрдбрд╝рд╛ рдерд╛, рд╡рд╣рд╛рдВ рд╕реЗ рдореИрдВ рдЙрдард╛ рд╕рдХреВрдВрдЧрд╛ред

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣рд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП strict = False рдЕрдкрдиреЗ рдкрд░ FilterMixin рд╡рдВрд╢рдЬ (рд╢рд╛рдпрдж View ред

рдХреНрдпрд╛ рдЖрдк рдЕрдирдмрд╛рдЙрдВрдб рдлреЙрд░реНрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ qs рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рд╢рд░реНрдд рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рдЬреИрд╕реЗ

-        if self.filterset.is_valid() or not self.get_strict():
+        if not self.filterset.is_bound or self.filterset.is_valid() or not self.get_strict():

https://github.com/carlongibson/django-filter/pull/1007

рдзрдиреНрдпрд╡рд╛рджред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

GuillaumeCisco picture GuillaumeCisco  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

csarcom picture csarcom  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

loganknecht picture loganknecht  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hakib picture hakib  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Sonictherocketman picture Sonictherocketman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ