带有字段名称的Flask WTForms动态可编辑表字段

时间:2018-07-04 03:46:21

标签: python flask jinja2 flask-wtforms

如何获取以文本/字符串形式返回的字段名称?

Highlighted "Field Names" I want returned as text, not fields

我正在动态创建字段列表,然后附加值。但是我似乎无法找出一种将字段名称返回为纯文本的方法。下面的代码将它们附加到字段(fieldname)上,这是我能够返回它们的唯一方法。

class ContractFields(FlaskForm):
    fieldname = StringField()
    fieldvalue = StringField()

class ContractForm(FlaskForm):
    title = StringField('title')
    contractfieldlist = FieldList(FormField(ContractFields))

@app.route('/tester.html', methods=['GET','POST'])
def contractfields():
    form = ContractForm()
    for f in object:
            document_form = ContractFields()
            document_form.fieldname = f.name #need this list object to return as table text, not a field
            document_form.fieldvalue = f.value

            form.contractfieldlist.append_entry(document_form)

    return render_template('tester.html', form = form)

从模板开始:

<div>
  <form action="" method="post" name="form">
    {{ form.hidden_tag() }}
    <div>
      <table>
        <tr>
          <th> ListNumber </th>
          <th> Field Name </th>
          <th> Field Value </th>
        </tr>
        {% for items in form.contractfieldlist %}
        <tr>
          <td>{{ items.label }}</td>
          <td>{{ items.fieldname }}</td>
          <td>{{ items.fieldvalue }}</td>
        </tr>
        {% endfor %}
      </table>
    </div>
    <p><input type="submit" name="edit" value="Send"></p>
  </form>
</div>

1 个答案:

答案 0 :(得分:0)

我在Python方面的经验在很大程度上受到ETL和数据转换的限制,所以我不明白为什么这么复杂。但是经过了很多小时,我终于找到了following solution worked for me

具体将上述文章的相关摘录修改为以下内容:

class ContractFields(FlaskForm):
        fieldname = HiddenField()
        fieldvalue = StringField()
        def __init__(self, *args, **kwargs):
                super(ContractFields, self).__init__(*args, **kwargs)
                if 'obj' in kwargs and kwargs['obj'] is not None:
                        self.fieldvalue.label.text = kwargs['obj'].fieldname

模板html可以:

      <td>{{ items.label }}</td>
      <td>{{ items.fieldvalue.label }}</td>
      <td>{{ items.fieldvalue }}</td>