目前我正在尝试创建一个表单,用户可以在其中创建闪存卡,并且没有固定数量的闪存卡 - 您可以添加或删除它们。
我尝试过使用
FieldList
的FormFields
,其中FormField
是闪存卡的一种形式。但是,我不完全理解这是如何工作的(文档不是很有帮助)并且无法创建可变数量的FormFields
。
此外,我尝试循环遍历
for
循环,并在每次迭代时创建一个新的 FormField
,但是这样我似乎无法单独访问每个字段的数据(我只获取第一个字段的数据)。
如果有人可以提供这些方法的修复方法或新方法,我将不胜感激。
我假设每张闪存卡都有一个标题和一些内容。在这种情况下最有意义的表单字段类型是 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
我知道这个问题目前已经很老了,但以防万一它对其他人有帮助:我相信
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
我希望这对其他人有帮助!