【问题标题】:How to auto-generate full HTML from a WTForms form如何从 WTForms 表单自动生成完整的 HTML
【发布时间】:2016-03-04 21:00:41
【问题描述】:

我正在尝试使用 Jinja2 模板为 SQLAlchemy 应用程序创建一个基于 WTForms 的简单管理界面。

我已阅读docs of WTForms-Alchemy 并了解它可以通过几行代码从我的模型自动生成表单,例如:

class UserForm(ModelForm):
    class Meta:
        model = User

我的问题是,即使我自动生成了这个表单,我也没有找到任何资源来说明如何将它变成一个功能性的 HTML 页面。有一些关于渲染字段错误的 sn-ps,以及一些提到用于渲染整个字段的宏的 SO 答案,但我发现绝对没有关于如何自动生成完整的功能表单的资源。

// 我知道这是 Flask-Admin 可能已经做的事情,我没有使用 Flask,所以很遗憾这不可能。

【问题讨论】:

    标签: python sqlalchemy jinja2 wtforms


    【解决方案1】:

    WTForms 让您决定在将表单传递到模板后如何呈现表单。呈现表单的最简单方法是遍历表单并呈现字段。当一个字段(或其标签)被调用时,它会发出 HTML。

    <form action="/some_url" method="POST">
       {% for field in form %}
           {{ field.label() }}
           {{ field() }}
       {% endfor %}
    
       <button type="submit" />
    </form>
    

    provided here 提供了一种自动生成围绕这些字段的 HTML 的方法。

    【讨论】:

    • 很好,虽然它也打印出 CSRF 令牌标签。 {% if field.type != 'CSRFTokenField' %}...{% endif %} 工作至今。
    • 链接已过期。
    【解决方案2】:

    您可以像这样使用 wtf.quick_form,在这种情况下,您将拥有一个完全通用的表单模板。使用 info{} 属性标记您的 db.Model 成员以设置字段显示名称等

    <form method="post" action="/{{route}}">
      <fieldset>
        {{ wtf.quick_form(form, button_map={'submit':'success'}) }}
        <input class="btn btn-success" type="submit" value="Submit" />  
        <button type="button" class="btn"><a href="/">Cancel</a></button>
      </fieldset>
    </form>
    

    您的表单定义:

    class MyobjectForm(BaseModelForm):
        class Meta:
            model = Myobject
    

    那么你的路由处理器看起来像这样:

    @app.route('/myobject', methods=('GET', 'POST'))
    def myobject_route():
        obj = Myobject()
        form = MyobjectForm(obj = obj)
        if form.validate_on_submit():
            form.populate_obj(obj)
            db.session.add(obj)
            db.session.commit()
            return redirect(url_for('index'))
        return render_template('form.j2', form=form, title='My Object', route='myobject')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2017-04-27
      • 2013-03-27
      • 2019-02-05
      • 1970-01-01
      • 2021-05-09
      • 1970-01-01
      相关资源
      最近更新 更多