我想使用WTForms和Jinja2在酒瓶中创建不同的表单。我给mysql打了个电话,它有一个字段类型。
因此,即表可以是:
form_id | type | key | options | default_value
1 | TextField | title | | test1
1 | SelectField | gender |{'male','female'}|
2 | TextAreaField| text | | Hello, World!然后我在form_id上查询。然后,我想创建一个具有返回行字段的WTforms的表单。
对于一种正常的形式,我会:
class MyForm(Form):
title = TextField('test1', [validators.Length(min=4, max=25)])
gender = SelectField('', choices=['male','female'])
def update_form(request):
form = MyForm(request.form)
if request.method == 'POST' and form.validate():
title = form.title.data
gender = form.gender.data
#do some updates with data
return .....
else:
return render_template('template.html',form)
#here should be something like:
#dict = query_mysql()
#new_form = MyForm(dict);
#render_template('template.html',new_form)我认为最好是创建一个空的表单,然后在for-循环中添加字段,但是如果表单被回发,如果没有在类中定义表单,我如何验证它呢?我有表单中的form_id,所以我可以生成它,然后进行验证。
发布于 2016-09-24 10:42:02
动态添加字段
我认为最好是创建一个空的表单,然后在for-循环中添加字段,但是如果表单被回发,如果没有在类中定义表单,我如何验证它呢?
在表单实例化之前使用表单类将字段添加到setattr:
def update_form(request):
table = query()
class MyForm(Form):
pass
for row in table:
setattr(MyForm, row.key, SomeField())
form = MyForm(request.form)然而,我认为你的问题是一个更大问题的一部分,我试图在下面讨论这个问题。
将表映射到窗体
您的表似乎很好地映射到表单本身。如果要从表中动态创建表单,可以自己编写逻辑。但是,当需要支持的字段和选项的范围不断扩大时,需要进行大量的维护工作。如果您正在使用SQLAlchemy,您可能想看看炼金术。从导言中看:
很多时候,当使用SQLAlchemy构建现代网络应用程序时,你会有与模型密切相关的表单。例如,您可能有一个项目模型,您希望创建一个允许人们发布新文章的表单。在这种情况下,在表单中定义字段类型和基本验证器是很费时的,因为您已经在模型中定义了字段。 Alchemy提供了一个帮助类,它允许您从SQLAlchemy模型创建表单类。
helper类是ModelForm,按照表的样式,下面是一个带有WTForms-炼金术的Python2/3示例。首先安装包wtforms-alchemy,这也会引入SQLAlchemy和WTForms。
from __future__ import print_function
from __future__ import unicode_literals
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from wtforms_alchemy import ModelForm
engine = create_engine('sqlite:///:memory:')
Base = declarative_base(engine)
Session = sessionmaker(bind=engine)
session = Session()
class MyClass(Base):
__tablename__ = 'mytable'
id = sa.Column(sa.BigInteger, autoincrement=True, primary_key=True)
title = sa.Column(sa.Unicode(5), nullable=False)
gender = sa.Column(sa.Enum('male', 'female', name='gender'))
text = sa.Column(sa.Text)
class MyForm(ModelForm):
class Meta:
model = MyClass
form = MyForm()
print('HTML\n====')
for field in form:
print(field)运行上述代码打印:
HTML
====
<input id="title" name="title" required type="text" value="">
<select id="gender" name="gender"><option value="male">male</option><option value="female">female</option></select>
<textarea id="text" name="text"></textarea>正如您所看到的,WTForms-炼金术在MyForm中做了很多事情。这门课的本质是:
class MyForm(Form):
title = StringField(validators=[InputRequired(), Length(max=5)])
gender = SelectField(choices=[('male', 'male'), ('female', 'female')])
text = TextField()WTForms-炼金术的文档似乎非常全面。我自己没有用过,但是如果我有类似的问题要解决的话,我一定会尝试的。
https://stackoverflow.com/questions/39640024
复制相似问题