2013-05-06 88 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 

固定我的問題。希望它有幫助