Я знаю, что мы можем изменить фильтр django в его методе init, и мы можем определить пользовательские функции фильтра для фильтрации набора запросов.
У меня есть выбор модели фильтр , который выбирает города из базы данных. Города содержат разные значения, например: Ахен, Ахен (Крайс) и др. c.
self.filters["city"] = ModelMultipleChoiceFilter(
queryset=City.objects.exclude(name__contains="Kreis").order_by("name")
)
У меня есть Булев фильтр с именем include_kreis
self.filters["include_kreis"] = BooleanFilter(
field_name="city", widget=forms.CheckboxInput, method=self.kreis_custom_filter, label="Include Kreis"
)
Как вы видите, изначально я исключил значения Kreis, и флажок снят.
Моя Пользовательская функция для фильтра include_kreis:
def kreis_custom_filter(self, queryset, name, value):
if value == False:
return queryset.exclude(city__name__contains="Kreis")
else:
return queryset.all()
Я добавляю города с Kreis в его имени для набора запросов на основе значения фильтра Bool.
Мне также нужно изменить значения в фильтре выбора модели City.
Примерно так:
self.filters["city"].queryset = City.objects.all().order_by("name")
Я пытался записать приведенную выше строку в пользовательской функции фильтра "include_kreis" в операторе else, но раскрывающийся список во внешнем интерфейсе не обновите значения.
НЕПРАВИЛЬНАЯ ПОПЫТКА:
def kreis_custom_filter(self, queryset, name, value):
if value == False:
return queryset.exclude(city__name__contains="Kreis")
else:
self.filters["city"].queryset = City.objects.all().order_by("name")
return queryset.all()
Для этого можно отправить запрос ajax и снова заполнить раскрывающийся список, но неэффективно, так как у меня есть другие фильтры и javascript обработчики событий, так что * 10 56 * путь - это то, чего я не могу go.
Есть ли способ обновить набор запросов фильтра ModelChoice, который у меня есть в пользовательской функции фильтра или DJANGO не позволяет это сделать?
Также, если есть возможность добавить оператор if в init и проверьте текущее значение фильтра bool, а затем: определите фильтр с различными наборами запросов, что также является приемлемым.
Что-то вроде в init :
def __init__(self, *args, result_type=None, **kwargs):
super(Evaluation_filter, self).__init__(*args, **kwargs)
self.filters["include_kreis"] = BooleanFilter(
field_name="city", widget=forms.CheckboxInput, method=self.kreis_custom_filter, label="Include Kreis"
)
if value of bool filter == on:
self.filters["city"] = ModelMultipleChoiceFilter(
queryset=City.objects.all().order_by("name")
)
else:
self.filters["city"] = ModelMultipleChoiceFilter(
queryset=City.objects.exclude(name__contains="Kreis").order_by("name")
)