在WTForms中创建可变数量的表单域

时间:2016-02-27 21:15:10

标签: flask wtforms flask-wtforms

目前我正在尝试创建一个用户可以创建闪存卡的表单,并且没有一定数量的闪存卡 - 您可以添加或删除它们。

我尝试使用FieldList FormFields,其中FormField是闪存卡的表单。但是,我不完全理解这是如何工作的(文档不是很有帮助),并且无法创建FormFields的变量数。

此外,我尝试循环遍历for循环并在每次迭代时创建一个新的FormField,但是有了这个,我似乎无法单独访问每个字段的数据(我只获得第一个字段的数据) )。

如果有人可以为这些方法或新方法提供修复,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我假设每张闪存卡都有一个标题和一些内容。在这种情况下最有意义的表单字段类型是来自WTForms的TextField&{39}和TextAreaField。由于您正在使用Flask-WTForms,因此您需要继承基础Form对象。

from flask.ext.wtf import Form
from wtforms import TextField, TextAreaField

class FlashCard(Form):
  title = TextField('Card title:')
  content = TextAreaField('Card content:')

在Flask视图功能中调用它时:

@app.route('/')
def index():
  my_form = FlashCard()
  if my_form.validate_on_submit:
     # save flash card data here.
  return render_template('index.html', my_form=my_form)

如果我是你,我会使用模态作为表格。 Bootstrap有一个非常容易使用的模式(需要Javascript)。当用户想要添加闪存卡时,另一个选项是重定向到表单页面。

重点是您可以为所有闪存卡使用相同的表单实例。希望这可以帮助。

如果你真的需要"动态表单组合"它是这样的(from wtforms doc's):

def my_view():
    class F(MyBaseForm):
        pass

    F.username = StringField('username')
    for name in iterate_some_model_dynamically():
        setattr(F, name, StringField(name.title()))

    form = F(request.POST, ...)
    # do view stuff