Python 如何从json中获取数字并相应地添加表单字段

Python 如何从json中获取数字并相应地添加表单字段,python,json,flask,flask-wtforms,Python,Json,Flask,Flask Wtforms,我正在构建一个物体检测应用程序。它检测给定图像中的平面,并将坐标写入字典: planes = {'Plane 1': {'Plane Coordinates': [20.0, 20.0, 551.0, 52.0], 'Plane Type': 1, 'Points': [2]}, 'Plane 2': {'Plane Coordinates': [502.0, 425.0, 741.0, 713.0], 'Plane Type': 7, 'Points': [2]}, 'Plane

我正在构建一个物体检测应用程序。它检测给定图像中的平面,并将坐标写入字典:

    planes = 
{'Plane 1': {'Plane Coordinates': [20.0, 20.0, 551.0, 52.0], 'Plane Type': 1, 'Points': [2]}, 
'Plane 2': {'Plane Coordinates': [502.0, 425.0, 741.0, 713.0], 'Plane Type': 7, 'Points': [2]}, 
'Plane 3': {'Plane Coordinates': [55.0, 669.0, 310.0, 736.0], 'Plane Type': 2, 'Points': [2]}, 
'Plane 4': {'Plane Coordinates': [503.0, 1194.0, 805.0, 1222.0], 'Plane Type': 5, 'Points': []}, 
'Plane 5': {'Plane Coordinates': [56.0, 1240.0, 391.0, 1268.0], 'Plane Type': 8, 'Points': []}}
但这里有一个棘手的部分:

我希望用户向
键添加值。所以当检测完成时,我想创建一个表单,人们可以在其中向检测到的平面添加点

我决定使用Flask WTForms(但我可以根据建议进行更改,也许我可以使用JS?),我只是不知道如何根据检测到的平面数复制相同的字段

所以我想出了这样的解决方案:

我将字典保存为JSON文件。然后在
forms.py
中,我用以下代码打开它:

json_file_path = "planes.json"

with open(json_file_path, 'r') as j:
     contents = json.loads(j.read())
试试这个:

class PlanesValue(Form):
for key in contents:
    plane = FieldList(StringField(key), min_entries=1)
submit = SubmitField('Submit')
但问题是它只是将最后一个
平面
,即
平面5
作为唯一的字段

我可以理解,因为它在内容中的键上循环,它只会出现字典中的最后一项,我不知道如何解决这个问题

此外,我不知道如何在表单验证时将这些值逐个添加到上面的
planes
字典中:/

如果有任何帮助,我将不胜感激。提前谢谢

编辑: 我想要达到的目标: 我希望表单查看
平面
字典,获取标签并生成:“平面1,平面2,平面3,平面4,平面5”
如果我了解您遇到的问题,我想我在自己的应用程序中也在做同样的事情。在Python事件处理器中,需要根据某个事件添加“平面”字段的实例。在这里,我用我称之为“过滤器”的东西来做这件事

这是我表格的一部分(我从实际申请中简化了一点)

如您所见,当用户点击addfilter按钮时,我添加了另一个过滤器行append_entry()方法可能是您需要的关键部分。屏幕上的结果如下所示


你能更好地解释一下你想要实现的目标吗?试着一步一步地给出一个简单的例子。您所说的“根据检测到的平面nb复制相同的字段”是什么意思?另外,你也可以通过
planes['Plane 1']['points']访问点列表并添加到其中。附加(3)
谢谢,我编辑了原始帖子并添加了我想要实现的内容。非常感谢你宝贵的回答,但我现在用自己的方法解决了问题,尽管这是一种丑陋的方式。我会在你描述的内容上加一个别针,然后在我重试时返回一个答案。太好了!如果你认为答案是最好的,你也可以发布自己的答案,并将其标记为正确答案。
class QueryDefFormRow(FlaskForm):
    tbl_col_name = SelectField(label='Column', render_kw={'title': "Column to filter on",'class': "form-control"})
    operator = SelectField(label='Operator', render_kw={'title': "Operation to perform",'class': "form-control"},
                           choices=[('=', '='), ('<', '<'), ('<=', '<='), ('>', '>'), ('>=', '>=')])
    value = StringField(label='Value', render_kw={'title': 'Value to filter against.','class': "form-control"})
    btn_delete = ImageButtonField(label='Delete',render_kw={'class': "btn btn-dark", 'title': 'Remove this filter', 'image_class':"fas fa-trash fa-sm"})

class QueryDefForm(FlaskForm):
    qry_def = FieldList(unbound_field=FormField(form_class=QueryDefFormRow))
    btn_add_filter = SubmitField(label='Add Filter', render_kw={'class': "btn btn-primary btn-fill btn-space",
                                                                'title': 'Add another filter'})
if form.btn_add_filter.data:  # User pressed the add row button
    form.qry_def.append_entry()