Skip to content

Commit 1e76d68

Browse files
Use QueryDict for data default. (#1691)
Co-authored-by: Carlton Gibson <[email protected]>
1 parent e709e5d commit 1e76d68

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

django_filters/filterset.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from django.db import models
88
from django.db.models.constants import LOOKUP_SEP
99
from django.db.models.fields.related import ManyToManyRel, ManyToOneRel, OneToOneRel
10-
from django.utils.datastructures import MultiValueDict
10+
from django.http import QueryDict
1111

1212
from .conf import settings
1313
from .constants import ALL_FIELDS
@@ -61,7 +61,11 @@ def __init__(self, options=None):
6161

6262
self.form = getattr(options, "form", forms.Form)
6363

64-
behavior = getattr(options, "unknown_field_behavior", UnknownFieldBehavior.RAISE)
64+
behavior = getattr(
65+
options,
66+
"unknown_field_behavior",
67+
UnknownFieldBehavior.RAISE,
68+
)
6569

6670
if not isinstance(behavior, UnknownFieldBehavior):
6771
raise ValueError(f"Invalid unknown_field_behavior: {behavior}")
@@ -192,7 +196,7 @@ def __init__(self, data=None, queryset=None, *, request=None, prefix=None):
192196
model = queryset.model
193197

194198
self.is_bound = data is not None
195-
self.data = data or MultiValueDict()
199+
self.data = data or QueryDict()
196200
self.queryset = queryset
197201
self.request = request
198202
self.form_prefix = prefix
@@ -380,7 +384,9 @@ def handle_unrecognized_field(cls, field_name, message):
380384
if behavior == UnknownFieldBehavior.RAISE:
381385
raise AssertionError(message)
382386
elif behavior == UnknownFieldBehavior.WARN:
383-
warnings.warn(f"Unrecognized field type for '{field_name}'. Field will be ignored.")
387+
warnings.warn(
388+
f"Unrecognized field type for '{field_name}'. Field will be ignored."
389+
)
384390
elif behavior == UnknownFieldBehavior.IGNORE:
385391
pass
386392
else:

tests/test_widgets.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.forms import NumberInput, Select, TextInput
2+
from django.http import QueryDict
23
from django.test import TestCase
34

45
from django_filters.widgets import (
@@ -143,6 +144,25 @@ def test_widget_with_blank_choice(self):
143144
</ul>""",
144145
)
145146

147+
def test_widget_with_empty_querydict(self):
148+
choices = (
149+
("", "---------"),
150+
("test-val1", "test-label1"),
151+
("test-val2", "test-label2"),
152+
)
153+
154+
w = LinkWidget(choices=choices)
155+
w.value_from_datadict(QueryDict(), {}, "price")
156+
self.assertHTMLEqual(
157+
w.render("price", ""),
158+
"""
159+
<ul>
160+
<li><a class="selected" href="?price=">All</a></li>
161+
<li><a href="?price=test-val1">test-label1</a></li>
162+
<li><a href="?price=test-val2">test-label2</a></li>
163+
</ul>""",
164+
)
165+
146166
def test_widget_value_from_datadict(self):
147167
w = LinkWidget()
148168
data = {"price": "test-val1"}

0 commit comments

Comments
 (0)