From edf2cf785bde6912d15fd2c1f9250fb617aa72c3 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