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

时间:2020-01-23 16:34:07

标签: python django django-filter

我知道我们可以在django过滤器的init方法中进行修改,并且可以定义用于过滤查询集的自定义过滤器功能。

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

AuthenticationManagerBuilder

我有一个布尔型过滤器,名为include_kreis

self.filters["city"] = ModelMultipleChoiceFilter(
            queryset=City.objects.exclude(name__contains="Kreis").order_by("name")
        )

如您所见,最初,我排除了Kreis值,并且未选中该复选框。

我的include_kreis过滤器的自定义函数是:

self.filters["include_kreis"] = BooleanFilter(
            field_name="city", widget=forms.CheckboxInput, method=self.kreis_custom_filter, label="Include Kreis"
        )

我正在根据布尔过滤器的值将名称中带有克雷伊斯的城市添加到查询集中。

我想要的是还修改模型选择过滤器“城市”中的值。

类似的事情:

def kreis_custom_filter(self, queryset, name, value):
    if value == False:
        return queryset.exclude(city__name__contains="Kreis")
    else:
        return queryset.all()

我尝试在else语句的自定义过滤器功能“ include_kreis”中写上一行,但是前端的下拉列表不更新

失败的尝试:

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

一种方法是发送ajax请求并重新填充Dropdown,但这效率低下,因为我有其他过滤器和javascript事件处理程序,因此AJAX方法是我无法做到的。

有没有一种方法可以更新我在自定义过滤器函数中拥有的ModelChoice过滤器的查询集,还是DJANGO不允许它?

如果有可能在init中添加if语句并检查bool过滤器的当前值,然后:用不同的查询集定义过滤器,这也是可以接受的。

类似于 init 中的内容:

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

1 个答案:

答案 0 :(得分:0)

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

可以在基于当前REQUEST的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”

相关问题