Skip to content

Django Filters

DjangoFilterBackend

Bases: DjangoFilterBackend

Customized DjangoFilterBackend to reduce queries count.

Source code in saritasa_drf_tools/filters/django_filters.py
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class DjangoFilterBackend(rest_framework.DjangoFilterBackend):
    """Customized DjangoFilterBackend to reduce queries count."""

    def to_html(
        self,
        request,  # noqa: ANN001
        queryset,  # noqa: ANN001
        view,  # noqa: ANN001
    ) -> str | None:
        """Convert ModelChoiceField's widget to TextInput."""
        filterset: rest_framework.FilterSet | None = self.get_filterset(
            request=request,
            queryset=queryset,
            view=view,
        )
        if filterset is None:
            return None

        form: forms.Form = filterset.form
        for field in form.fields.values():
            if isinstance(field, forms.ModelChoiceField):
                field.widget = forms.TextInput()
        template = loader.get_template(template_name=self.template)
        context = {
            "filter": filterset,
        }
        return template.render(context, request)

to_html(request, queryset, view)

Convert ModelChoiceField's widget to TextInput.

Source code in saritasa_drf_tools/filters/django_filters.py
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def to_html(
    self,
    request,  # noqa: ANN001
    queryset,  # noqa: ANN001
    view,  # noqa: ANN001
) -> str | None:
    """Convert ModelChoiceField's widget to TextInput."""
    filterset: rest_framework.FilterSet | None = self.get_filterset(
        request=request,
        queryset=queryset,
        view=view,
    )
    if filterset is None:
        return None

    form: forms.Form = filterset.form
    for field in form.fields.values():
        if isinstance(field, forms.ModelChoiceField):
            field.widget = forms.TextInput()
    template = loader.get_template(template_name=self.template)
    context = {
        "filter": filterset,
    }
    return template.render(context, request)