【问题标题】:rendering forms with flask + wtform使用 flask + wtform 渲染表单
【发布时间】:2013-04-30 15:58:57
【问题描述】:

有问题的代码:

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>

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

【问题讨论】:

  • 你能用你正在使用的导入更新你的问题吗?
  • 我已经添加了导入
  • 你从哪里导入model_form
  • 试试改成form = model_form(Member, base_class=Form)我相信你有版本问题。
  • 我已经添加了,但它仍然不起作用。我的 model_form 是 wtforms 的一部分而不是 flask ext 的一部分可以吗?

标签: python flask wtforms


【解决方案1】:

你需要做更多的工作:

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

【讨论】:

  • 我试过你的建议,我得到:TypeError: 'Unbound Field' object is not callable.
【解决方案2】:

您将表单 class 而不是表单 instance 传递给模板。 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)

【讨论】:

    【解决方案3】:

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

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

    from wtforms import Form
    

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

    from flask.ext.wtf import Form
    

    解决了我的问题。希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 1970-01-01
      相关资源
      最近更新 更多