Skip to content

Commit 3a7ee3b

Browse files
committed
Allow to override the default blank value "__None"
1 parent c0d7414 commit 3a7ee3b

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

docs/wtforms_sqlalchemy.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ your forms.
3333
form.blog.query = Blog.query.filter(Blog.author == request.user).order_by(Blog.name)
3434
3535
36-
.. autoclass:: QuerySelectField(default field args, query_factory=None, get_pk=None, get_label=None, allow_blank=False, blank_text=u'')
36+
.. autoclass:: QuerySelectField(default field args, query_factory=None, get_pk=None, get_label=None, allow_blank=False, blank_text=u'', blank_value=u'__None')
3737

3838
.. autoclass:: QuerySelectMultipleField(default field args, query_factory=None, get_pk=None, get_label=None)
3939

tests/tests.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,13 @@ class F(Form):
141141
query_factory=lambda: sess.query(self.PKTest),
142142
widget=LazySelect(),
143143
)
144+
c = QuerySelectField(
145+
allow_blank=True,
146+
blank_text="",
147+
blank_value="",
148+
query_factory=lambda: sess.query(self.PKTest),
149+
widget=LazySelect(),
150+
)
144151

145152
form = F()
146153
self.assertEqual(form.a.data, None)
@@ -154,9 +161,14 @@ class F(Form):
154161
("hello2", "banana", False),
155162
],
156163
)
164+
self.assertEqual(form.c.data, None)
165+
self.assertEqual(
166+
form.c(),
167+
[("", "", True), ("hello1", "apple", False), ("hello2", "banana", False)],
168+
)
157169
self.assertFalse(form.validate())
158170

159-
form = F(DummyPostData(a=["1"], b=["hello2"]))
171+
form = F(DummyPostData(a=["1"], b=["hello2"], c=[""]))
160172
self.assertEqual(form.a.data.id, 1)
161173
self.assertEqual(form.a(), [("1", "apple", True), ("2", "banana", False)])
162174
self.assertEqual(form.b.data.baz, "banana")
@@ -168,6 +180,11 @@ class F(Form):
168180
("hello2", "banana", True),
169181
],
170182
)
183+
self.assertEqual(form.c.data, None)
184+
self.assertEqual(
185+
form.c(),
186+
[("", "", True), ("hello1", "apple", False), ("hello2", "banana", False)],
187+
)
171188
self.assertTrue(form.validate())
172189

173190
# Make sure the query is cached

wtforms_sqlalchemy/fields.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ class QuerySelectField(SelectFieldBase):
5151
If `allow_blank` is set to `True`, then a blank choice will be added to the
5252
top of the list. Selecting this choice will result in the `data` property
5353
being `None`. The label for this blank choice can be set by specifying the
54-
`blank_text` parameter.
54+
`blank_text` parameter. The value for this blank choice can be set by
55+
specifying the `blank_value` parameter (default: `__None`).
5556
"""
5657

5758
widget = widgets.Select()
@@ -65,6 +66,7 @@ def __init__(
6566
get_label=None,
6667
allow_blank=False,
6768
blank_text="",
69+
blank_value="__None",
6870
**kwargs
6971
):
7072
super().__init__(label, validators, **kwargs)
@@ -88,6 +90,7 @@ def __init__(
8890

8991
self.allow_blank = allow_blank
9092
self.blank_text = blank_text
93+
self.blank_value = blank_value
9194
self.query = None
9295
self._object_list = None
9396

@@ -114,14 +117,14 @@ def _get_object_list(self):
114117

115118
def iter_choices(self):
116119
if self.allow_blank:
117-
yield ("__None", self.blank_text, self.data is None)
120+
yield (self.blank_value, self.blank_text, self.data is None)
118121

119122
for pk, obj in self._get_object_list():
120123
yield (pk, self.get_label(obj), obj == self.data)
121124

122125
def process_formdata(self, valuelist):
123126
if valuelist:
124-
if self.allow_blank and valuelist[0] == "__None":
127+
if self.allow_blank and valuelist[0] == self.blank_value:
125128
self.data = None
126129
else:
127130
self._data = None

0 commit comments

Comments
 (0)