用flask + wtform渲染表单 [英] rendering forms with flask + wtform

查看:178
本文介绍了用flask + wtform渲染表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有问题的代码:

  from flask import Blueprint,render_template,abort $ b $ from flask.ext.wtf import形式
从jinja2导入os
导入TemplateNotFound
从模型导入Member
从wtforms.ext.sqlalchemy.orm导入model_form
@ simple_page.route('/ register' )
def register():
form = model_form(Member,Form)
return render_template('register.html',form = form,name =bad)


成员(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>]))> ,而不是一个实际的字段。如何获得一个实际的表单/字段与该平台?

解决方案

strong>不是实例的形式。 model_form 方法动态地生成一个新类,可以像其他任何形式的子类那样重用,扩展和使用。在你的视图的每次运行中生成这个表单类也是不必要的,所以你可以把这个调用移到你的视图之外。



传递一个没有实际意义的类是也是为什么你会得到与UnboundField相关的奇怪行为(这是WTForms如何处理声明性字段实例)

修正很简单:

pre $ 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)


code in question:

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)

and in my view:

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

this outputs <UnboundField(TextField, (), {u'default': None, u'filters': [], u'validators': [<wtforms.validators.Required object at 0x7f62f59b5590>, <wtforms.validators.Length object at 0x7f62f59b55d0>]})>, not an actual field. how do i get an actual form/field with the wtform?

解决方案

You're passing a form class not a form instance to the template. The model_form method generates a new class dynamically, which can be re-used, extended, and otherwise used like any other form subclass. It's also quite un-necessary to generate this form class on every run of your view, so you can move this call outside of your view.

You passing an uninstantiated class is also why you get strange behavior relating to UnboundField (which is how WTForms handles declarative field instantiation)

The fix is simple:

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)

这篇关于用flask + wtform渲染表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆