Skip to content

Commit 508a175

Browse files
committed
Add correct support for nullable dictionaries
1 parent 592438e commit 508a175

File tree

2 files changed

+22
-7
lines changed

2 files changed

+22
-7
lines changed

flask_mongoengine/db_fields.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,13 @@ class DictField(WtfFieldMixin, fields.DictField):
459459

460460
DEFAULT_WTF_FIELD = custom_fields.MongoDictField if custom_fields else None
461461

462+
@property
463+
def wtf_generated_options(self) -> dict:
464+
"""Extends default field options with `null` bypass."""
465+
options = super().wtf_generated_options
466+
options["null"] = self.null
467+
return options
468+
462469

463470
class DynamicField(WtfFieldMixin, fields.DynamicField):
464471
"""

flask_mongoengine/wtf/fields.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ def __init__(
425425
json_encoder_kwargs: Optional[dict] = None,
426426
json_decoder: Optional[Callable] = None,
427427
json_decoder_kwargs: Optional[dict] = None,
428+
null: Optional[bool] = None,
428429
*args,
429430
**kwargs,
430431
):
@@ -449,7 +450,14 @@ def __init__(
449450
self.json_decoder = json_decoder or json.loads
450451
self.json_decoder_kwargs = json_decoder_kwargs or {}
451452
self.data = None
453+
self.null = null
452454
super().__init__(*args, **kwargs)
455+
try:
456+
self._default = self.default()
457+
except TypeError:
458+
self._default = self.default
459+
if isinstance(self._default, dict):
460+
self._default = self.json_encoder(self._default, **self.json_encoder_kwargs)
453461

454462
def _parse_json_data(self):
455463
"""Tries to load JSON data with python internal JSON library."""
@@ -476,10 +484,10 @@ def process_formdata(self, valuelist):
476484

477485
def _value(self):
478486
"""Show existing data as pretty-formatted, or show raw data/empty dict."""
479-
if self.data:
480-
if isinstance(self.data, dict):
481-
return self.json_encoder(self.data, **self.json_encoder_kwargs)
482-
else:
483-
# This allows to fix/see input errors, without escaping.
484-
return self.data
485-
return "{}"
487+
if self.data is not None:
488+
return (
489+
self.json_encoder(self.data, **self.json_encoder_kwargs)
490+
if isinstance(self.data, dict)
491+
else self.data
492+
)
493+
return self._default if self._default is not None and not self.null else ""

0 commit comments

Comments
 (0)