Python 如何从模型生成的表单中指定所需的小部件(例如,文本区域而不是简单的文本输入)?烧瓶炼金术
我已经使用中的片段从Flask中的模型创建了WTForms表单。除了只创建输入字段之外,其他一切都可以正常工作。我希望描述(见下面的models.py)是一个文本区域。有什么想法吗 从models.py:Python 如何从模型生成的表单中指定所需的小部件(例如,文本区域而不是简单的文本输入)?烧瓶炼金术,python,flask,flask-sqlalchemy,wtforms,flask-wtforms,Python,Flask,Flask Sqlalchemy,Wtforms,Flask Wtforms,我已经使用中的片段从Flask中的模型创建了WTForms表单。除了只创建输入字段之外,其他一切都可以正常工作。我希望描述(见下面的models.py)是一个文本区域。有什么想法吗 从models.py: title = db.Column(db.String(55)) description = db.Column(db.Text) 从views.py MyForm = model_form(MyModel, base_class=Form) form = MyForm() return r
title = db.Column(db.String(55))
description = db.Column(db.Text)
从views.py
MyForm = model_form(MyModel, base_class=Form)
form = MyForm()
return render_template('create.html', form=form)
从create.html
{% for field in form %}
{{field.label}}
{{field}}
{% endfor %}
输出:
<input id="title" name="title" type="text" value="">
<input id="description" name="description" type="text" value="">
我想要的是:
<input id="title" name="title" type="text" value="">
<textarea id="description" name="description"></textarea>
您可以创建如下自定义表单: forms.py
from flask.ext.wtf import Form
from wtforms.fields import TextField, TextAreaField, SubmitField
import wtforms
class ItemForm(Form):
title = Textfield('Title')
description = TextAreaField('Description')
submit = SubmitField('Submit')
routes.py
from forms import ItemForm
@app.route('/form')
def form()
form = ItemForm()
return render_template('form.html', form=form)
form.html
{% for field in form %}
{{field.label}}
{{field}}
{% endfor %}
本教程提供了更多信息:您可以使用
模型表单
的字段参数
覆盖特定字段的设置。您可以设置从标签到验证器的所有内容。它接受字段的任何有效参数。\uuuu init\uuuu()
,包括小部件
MyForm = model_form(MyModel, base_class=Form, field_args={
'description': {'widget': TextArea()},
})
如果您想了解还可以覆盖哪些内容,请查看。您使用的WTForms扩展名是什么?from flask.ext.wtf import Form from WTForms.ext.sqlalchemy.orm import model\u Form
WTForms.ext.sqlalchemy
在版本2中被弃用,取而代之的是WTForms\u alchemy
。你可能想看看这个。另一个选项是使用field_args
参数将description
小部件设置为model_form
。我一直在寻找一些类似的解决方案,但我不知道这是否是我想要的。我认为,如果我可以直接从模型生成表单,并将约束跳过到单独的表单类,那将是一件好事。这将是一件好事,但有时为了获得您想要的确切结果,您可能需要从自动生成的结果中退出。