2013-05-06 64 views
6

代码:与烧瓶+ wtform呈现形式有关

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>]})>,并非实际场。我如何获得与该平台的实际表单/字段?

+0

你能用你正在使用的导入来更新你的问题吗? – 2013-05-07 04:51:27

+0

我已添加进口 – tipu 2013-05-07 05:20:52

+1

从哪里导入'model_form'? – 2013-05-07 05:21:50

回答

2

你需要做一些更多的工作:

{{ form.name.label }} : {{ form.name()|safe }} 

或者,你可以使用这个handy snippet

{% macro render_field(field) %} 
    <dt>{{ field.label }} 
    <dd>{{ field(**kwargs)|safe }} 
    {% if field.errors %} 
    <ul class=errors> 
    {% for error in field.errors %} 
     <li>{{ error }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
    </dd> 
{% endmacro %} 

当然,调整呈现的HTML。将该文件保存在templates目录中的某个位置,然后保存在主模板中。这里的formhelpers.html

{% from "formhelpers.html" import render_field %} 
<form method=post action="/register"> 
    <dl> 
    {{ render_field(form.name) }} 
    {{ render_field(form.email) }} 
    </dl> 
    <p><input type=submit value=Register> 
</form> 
+0

我试过你的建议,我得到:TypeError:'未绑定的字段'对象不可调用。 – tipu 2013-05-07 03:06:59

11

你传递一种形式不是一个形式实例到模板。 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) 
+0

上面的例子为我工作。非常感谢。 – jwogrady 2014-04-07 22:29:41

1

我知道这是相当老,但我有同样的问题,我想分享我的解决方案的期货需求。

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

from wtforms import Form 

而且这看起来不错,但是使用烧瓶时,我不得不这样做:

from flask.ext.wtf import Form 

固定我的问题。希望它有帮助