Для того чтобы реализовать авто-обновление не статичных choices для django_filters ChoiceField, вам потребуется создать свой фильтр, который будет обновлять список доступных значения поля в зависимости от условий.
В Django Filters, ChoiceField использует статичный список значений, определенный заранее. Однако, если вы хотите, чтобы значения в поле обновлялись динамически, вам нужно создать свой фильтр с использованием класса BaseType или NumberFilter вместо ChoiceFilter.
В первую очередь, вам нужно создать свой собственный фильтр, наследуемый от NumberFilter или BaseType, и реализовать метод get_filter_choices(self, field)
в своем фильтре.
Вот пример класса фильтра:
from django_filters.filters import NumberFilter class DynamicChoiceFilter(NumberFilter): def get_filter_choices(self, field): # ваш код для авто-обновления choices # вы можете выполнять запросы к базе данных или получать значения из какого-либо сервиса # здесь можно реализовать логику, которая будет возвращать динамические значения в зависимости от ваших требований return [ ('value1', 'Label 1'), ('value2', 'Label 2'), ('value3', 'Label 3'), # ... ]
Теперь, когда у нас есть наш собственный фильтр, мы можем использовать его в качестве поля фильтрации в django_filters.FilterSet. Пример использования:
from django_filters import FilterSet from .models import MyModel class MyFilterSet(FilterSet): my_field = DynamicChoiceFilter(field_name='my_field') class Meta: model = MyModel fields = ['my_field'] # здесь вы можете указать другие поля для фильтрации
Обратите внимание, что мы указываем field_name
в DynamicChoiceFilter
, чтобы указать поле модели, для которого мы хотим создать фильтр.
Указав 'my_field'
в fields
в классе Meta
FilterSet, мы можем использовать его в представлении или шаблоне для фильтрации данных.
Теперь, каждый раз, когда вы будете использовать этот фильтр, список значений для поля my_field
будет обновляться автоматически в зависимости от вашей логики обновления. Вы можете настроить это, например, с помощью ajax-запросов к серверу или обращаясь к внешним сервисам для получения динамических значений.
Надеюсь, это поможет вам решить вашу задачу!