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

问题描述 投票:0回答:2

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

我尝试过使用

FieldList
FormFields
,其中
FormField
是闪存卡的一种形式。但是,我不完全理解这是如何工作的(文档不是很有帮助)并且无法创建可变数量的
FormFields

此外,我尝试循环遍历

for
循环,并在每次迭代时创建一个新的
FormField
,但是这样我似乎无法单独访问每个字段的数据(我只获取第一个字段的数据)。

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

flask wtforms flask-wtforms
2个回答
0
投票

我假设每张闪存卡都有一个标题和一些内容。在这种情况下最有意义的表单字段类型是 WTForms 中的

TextField
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)。当用户想要添加闪存卡时,另一个选项可以重定向到表单页面。

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

如果您确实需要“动态表单组合”,则如下所示(来自 WTForms 文档):

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

0
投票

我知道这个问题目前已经很老了,但以防万一它对其他人有帮助:我相信

FieldList
FormField
是这里的正确解决方案。

(我无法从wgwz的工作答案中获得动态表单构成。)

我将使用 wgwz 给出的示例代码:

from flask_wtf import FlaskForm
from wtforms import TextField, TextAreaField

class FlashCardForm(FlaskForm):
  title = TextField('Card title:')
  content = TextAreaField('Card content:')

现在,我将创建一个新表单来保存所有抽认卡:

class FlashCardSubmissionForm(FlaskForm):
  flashcards = FieldList(FormField(FlashCardForm), min_entries=1)

然后,我可以在如下路线中使用新表单:

@app.route('/submit/', methods=["POST"])
def submit_flashcards():
  # Here's an example of what your request data would look like:
  example_data = {"flashcards": [
    {title: "Andy Dwyer", content: "Loveable idiot; fell in a pit"},
    {title: "Bert Macklin", content: "Incredible FBI agent"}
  ]}
  form = FlashCardSubmissionForm()
  # I'm not sure why, but I needed to process the data like this
  # in order to populate the FieldList.
  form.process(data=example_data)

由于我没有使用 Jinja 来渲染我的表单,所以我无法告诉你如何做到这一点,但这个答案有一个你可以使用的示例:https://stackoverflow.com/a/28378186 /3761310

我希望这对其他人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.