一尘不染

用flask + wtform渲染表单

flask

有问题的代码:

from flask import Blueprint, render_template, abort
from flask.ext.wtf import Form
import os
from jinja2 import TemplateNotFound
from models import Member
from wtforms.ext.sqlalchemy.orm import model_form
@simple_page.route('/register')
def register():
    form = model_form(Member, Form)
    return render_template('register.html', form=form, name="bad")


class Member(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    email = db.Column(db.String(50), nullable=False, unique=True)

在我看来:

        <p class="txt11 colorb">
        {{ form.name }}
        </p>

此输出<UnboundField(TextField, (), {u'default': None, u'filters': [], u'validators': [<wtforms.validators.Required object at 0x7f62f59b5590>, <wtforms.validators.Length object at 0x7f62f59b55d0>]})>,而不是实际字段。我如何使用wtform获得实际的表单/字段?


阅读 627

收藏
2020-04-07

共2个答案

一尘不染

我知道这已经很老了,但是我遇到了同样的问题,我想分享自己的解决方案以满足期货需求。

我还得到了由“ UnboundField”呈现的html。与代码战斗之后,我发现我正在使用:

from wtforms import Form

它看起来不错,但是在使用Flask时,我必须这样做:

from flask.ext.wtf import Form

解决了我的问题。希望能有所帮助

2020-04-07
一尘不染

你正在将表单类而不是表单实例传递给模板。该model_form方法动态生成一个新类,可以像其他任何形式的子类一样重复使用,扩展和使用它。在每次运行视图时都不需要生成此表单类,因此可以将调用移到视图之外。

你传递未实例化的类也是为什么你得到与UnboundField有关的奇怪行为的原因(这是WTForms处理声明性字段实例化的方式)

解决方法很简单:

MemberForm = model_form(Member, base_class=Form)

@simple_page.route('/register')
def register():
    form = MemberForm(name=u'bad')
    return render_template('register.html', form=form)
2020-04-07