From 673ee6d7cc2386a233743e0daececc5b45459a5d Mon Sep 17 00:00:00 2001 From: Konrad Mohrfeldt <konrad.mohrfeldt@farbdev.org> Date: Wed, 23 Mar 2022 01:34:16 +0100 Subject: [PATCH] feat: add new syntaxes for filtering by choices In addition to the ?foo=1,2,3 filter syntax we now also support ?foo=1&foo=2&foo=3 ?foo[]=1&foo[]=2&foo[]=3 --- program/filters.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/program/filters.py b/program/filters.py index 4afad051..7e8a3eb7 100644 --- a/program/filters.py +++ b/program/filters.py @@ -20,8 +20,19 @@ class StaticFilterHelpTextMixin: class ModelMultipleChoiceFilter(filters.ModelMultipleChoiceFilter): + class QueryArrayWidget(widgets.QueryArrayWidget): + # see: https://github.com/carltongibson/django-filter/issues/1047 + def value_from_datadict(self, data, files, name): + new_data = {} + for key in data.keys(): + if len(data.getlist(key)) == 1 and "," in data[key]: + new_data[key] = data[key] + else: + new_data[key] = data.getlist(key) + return super().value_from_datadict(new_data, files, name) + def __init__(self, *args, **kwargs): - kwargs.setdefault("widget", widgets.CSVWidget()) + kwargs.setdefault("widget", self.QueryArrayWidget()) kwargs["lookup_expr"] = "in" super().__init__(*args, **kwargs) -- GitLab