首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在WTform中创建动态字段

在WTform中创建动态字段
EN

Stack Overflow用户
提问于 2016-09-22 13:09:59
回答 1查看 8.2K关注 0票数 9

我想使用WTForms和Jinja2在酒瓶中创建不同的表单。我给mysql打了个电话,它有一个字段类型。

因此,即表可以是:

代码语言:javascript
复制
 form_id   |  type         |   key    |    options      | default_value
    1      |  TextField    |   title  |                 |      test1
    1      |  SelectField  |   gender |{'male','female'}|      
    2      |  TextAreaField|   text   |                 |   Hello, World!

然后我在form_id上查询。然后,我想创建一个具有返回行字段的WTforms的表单。

对于一种正常的形式,我会:

代码语言:javascript
复制
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,所以我可以生成它,然后进行验证。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-24 10:42:02

动态添加字段

我认为最好是创建一个空的表单,然后在for-循环中添加字段,但是如果表单被回发,如果没有在类中定义表单,我如何验证它呢?

在表单实例化之前使用表单类将字段添加到setattr

代码语言:javascript
复制
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。

代码语言:javascript
复制
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)

运行上述代码打印:

代码语言:javascript
复制
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中做了很多事情。这门课的本质是:

代码语言:javascript
复制
class MyForm(Form):
    title = StringField(validators=[InputRequired(), Length(max=5)])
    gender = SelectField(choices=[('male', 'male'), ('female', 'female')])
    text = TextField()

WTForms-炼金术的文档似乎非常全面。我自己没有用过,但是如果我有类似的问题要解决的话,我一定会尝试的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39640024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档