Skip to content

Commit 6fec116

Browse files
committed
adds the ability to change the label on every object in a queryset for ReferenceFields
1 parent a379409 commit 6fec116

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

flask_mongoengine/wtf/fields.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,15 @@ def __init__(
4747
label_attr="",
4848
allow_blank=False,
4949
blank_text="---",
50+
label_modifier=None,
5051
**kwargs,
5152
):
5253

5354
super(QuerySetSelectField, self).__init__(label, validators, **kwargs)
5455
self.label_attr = label_attr
5556
self.allow_blank = allow_blank
5657
self.blank_text = blank_text
58+
self.label_modifier = label_modifier
5759
self.queryset = queryset
5860

5961
def iter_choices(self):
@@ -65,7 +67,12 @@ def iter_choices(self):
6567

6668
self.queryset.rewind()
6769
for obj in self.queryset:
68-
label = self.label_attr and getattr(obj, self.label_attr) or obj
70+
label = (
71+
self.label_modifier(obj)
72+
if self.label_modifier
73+
else (self.label_attr and getattr(obj, self.label_attr) or obj)
74+
)
75+
6976
if isinstance(self.data, list):
7077
selected = obj in self.data
7178
else:

flask_mongoengine/wtf/orm.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ def convert(self, model, field, field_args):
8989
if hasattr(field, "to_form_field"):
9090
return field.to_form_field(model, kwargs)
9191

92+
if type(field.field) == ReferenceField:
93+
kwargs["label_modifier"] = getattr(
94+
model, field.name + "_label_modifier", None
95+
)
96+
9297
if ftype in self.converters:
9398
return self.converters[ftype](model, field, kwargs)
9499

tests/test_forms.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,31 @@ class Post(db.Document):
534534
form = PostForm()
535535
self.assertTrue("content-text" in "%s" % form.content.text)
536536

537+
def test_form_label_modifier(self):
538+
with self.app.test_request_context("/"):
539+
db = self.db
540+
541+
class FoodItem(db.Document):
542+
title = db.StringField()
543+
544+
class FoodStore(db.Document):
545+
title = db.StringField(max_length=120, required=True)
546+
food_items = db.ListField(db.ReferenceField(FoodItem))
547+
548+
def food_items_label_modifier(obj):
549+
return obj.title
550+
551+
fruit_names = ["banana", "apple", "pear"]
552+
553+
food_items = [FoodItem(title=name).save() for name in fruit_names]
554+
555+
FoodStore(title="John's fruits", food_items=food_items).save()
556+
557+
FoodStoreForm = model_form(FoodStore)
558+
form = FoodStoreForm()
559+
560+
assert [obj.label.text for obj in form.food_items] == fruit_names
561+
537562

538563
if __name__ == "__main__":
539564
unittest.main()

0 commit comments

Comments
 (0)