簡體   English   中英

使用flask + wtform渲染表單

[英]rendering forms with flask + 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>]})> ,而不是實際的字段。 如何使用wtform獲得實際的表單/字段?

您正在將表單而不是表單實例傳遞給模板。 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)

你需要做更多的工作:

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

或者,您可以使用這個方便的代碼段

{% 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>

我知道這已經很老了,但我有同樣的問題,我想分享我的期貨需求解決方案。

我還得到了“UnboundField”渲染的html。 在與我發現我使用的代碼打架后:

from wtforms import Form

它看起來不錯,但是當使用Flask時我必須這樣做:

from flask.ext.wtf import Form

解決了我的問題。 希望它有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM