根据其他筛选器的值更新模型选择筛选器的查询集



我知道我们可以在其 init 方法中修改 django 过滤器,我们可以定义自定义过滤器函数来过滤查询集。

我有一个模型选择过滤器,可以从数据库中获取城市。城市包含不同的值,例如:亚琛,亚琛(Kreis(等。

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 的城市添加到查询集中。

我想要的是修改模型选择过滤器 City 中的值。

像这样:

self.filters["city"].queryset = City.objects.all().order_by("name")

我尝试在 else 语句中的自定义过滤器函数"include_kreis"中编写上述行,但前端的下拉列表不会更新值。

失败的尝试:

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 事件处理程序,所以 AJAX 方式是我不能去的。

有没有办法更新我在自定义过滤器函数中的模型选择过滤器的查询集,还是 DJANGO 不允许这样做?

此外,如果可以在 init 中添加一个 if 语句并检查布尔过滤器的当前值,然后:使用不同的查询集定义过滤器,这也是可以接受的。

类似于初始化

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")
)

好的,我想出了解决方案:

我可以根据当前请求在 init 方法中添加一个 if 语句。我注意到在 *args 中,正在发送整个请求。

解决方案:

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"
)
#evaluate if the checkbox is checked
if args[0] and args[0].get("include_kreis"):
city_queryset = City.objects.all().order_by("name")
else:
city_queryset = City.objects.exclude(name__contains="Kreis").order_by("name")
self.filters["city"] = ModelMultipleChoiceFilter(queryset=city_queryset)

args[0]是字典形式的请求。

然后我必须从中获取include_kreis的当前值。

因为它是一个布尔过滤器,所以只有在选中/选择它时才会填充在请求中,因此我使用args[0].get()

然后基于 if 语句,我可以填充城市下拉列表的值。

如果选中该复选框,请包括所有城市否则排除"Kreis">

最新更新