如何使用 Flask-WTForms 以 DRY 方式创建重复的表单元素?

How can I create repetitive form elements in a DRY way with Flask-WTForms?

我有一个 WTForms 表单,我希望用户能够在其中上传最多 10 张图片,并为图片提供标题和致谢。目前我声明了所有 10 组字段,但这似乎是多余的。有没有办法创建具有动态名称的表单字段,以便我可以在循环中创建它们?

class MyForm(Form):
    image1 = FileField('Upload')
    image1_caption = StringField('Caption')
    image1_credit = StringField('Credit')
    image2 = FileField('Upload')
    image2_caption = StringField('Caption')
    image2_credit = StringField('Credit')
    # ...through 10 images...

您可以通过组合 FormField with FieldList:

来获得您想要的东西
class ImageForm(Form):
    image = FileField('Upload')
    caption = StringField('Caption')
    credit = StringField('Credit')

class MyForm(Form):
    images = FieldList(FormField(ImageForm), min_entries=10)

然后您可以通过 my_form_instance.images.entries 或遍历 my_form_instance.images:

来访问单个 ImageForm 实例
for image in my_form_instance.images:
    print(image.data['caption'], image.data['credit'])