Flask WTForms 动态表单依赖项 selectField 未填充在编辑页面中

Posted

技术标签:

【中文标题】Flask WTForms 动态表单依赖项 selectField 未填充在编辑页面中【英文标题】:Flask WTForms dynamic forms dependencies selecField not populate in edit page 【发布时间】:2019-12-19 16:46:35 【问题描述】:

我有要在编辑页面中重新填充的表单,在我的表单中,我有三个相互连接的 selectField 来填充。但是我的第一个 selectField (Cars) 在编辑页面中重新填充后没有选择正确的值,并且我的代码没有错误。

这是我的场景,当我单击表格中的编辑时。数据将以编辑形式填充。但是 Car selectedField 没有选择正确的汽车。见下图...

如何重新填充编辑页面中的数据并在选定字段中选择正确的值?

这是我的代码:

views.py

@bp.route('/edit_orders/<int:obj_id>/edit', methods=['GET'])
def edit_orders(obj_id):
    orders = Order.query.get(obj_id)
    form = OrderForm(obj=orders)
    form.cars.choices = [(c.id, c.car) for c in Car.query.order_by('id')]
    form.models.choices = [(m.id, m.model) for m in Model.query.filter(Model.car_id == orders.cars.id).all()]
    form.versions.choices = [(v.id, v.version) for v in Version.query.filter(Version.model_id == orders.models.id).all()]

    return render_template('edit_order.html', title="Edit Orders", form=form)

model.py

class Car(Base):
    __tablename__ = 'cars'
    id = Column(Integer, primary_key=True)
    car = Column(String(128), nullable=False)
    models = relationship("Model", back_populates="cars") # relationship
    orders = relationship("Order", back_populates="cars")

    def __init__(self, car=None):
        self.car = car

    def __repr__(self):
        return '<Car %r>' % self.car

    @property 
    def serializable(self):
        return 'id':self.id, 'car':self.car

form.py

# -*- coding: utf-8 -*-
from flask_wtf import Form
from wtforms import SelectField, TextField, validators


class OrderForm(Form):
    cars = SelectField(u'Car', coerce=int)
    models = SelectField(u'Model', choices=[('', '--choose--')])
    versions = SelectField(u'Version', choices=[('', '--choose--')])
    customer_name = TextField(u'Customer', [validators.InputRequired('Customer is required.')])

这都是我在 github 中的 source code。 我希望有人可以修复我的错误/错误。 谢谢高级。

【问题讨论】:

你的问题不是很清楚,你能解释清楚是什么问题吗? 我的问题是,加载编辑表单时,我无法重新填充数据并在 selectedField car、model 和 version 中选择正确的数据。 如果我使用 .filter_by() 我的 selectField 只有一行数据。 【参考方案1】:

我从this link得到了答案。

这是我的更新代码,用于在我的编辑页面中填充依赖项 wtforms 选择字段。

views.py

@bp.route('/edit_orders/<int:obj_id>/edit', methods=['GET'])
def edit_orders(obj_id):
    orders = Order.query.get(obj_id)
    form = OrderForm(obj=orders)
    form.car.choices = [(c.id, c.car) for c in Car.query.all()]
    form.model.choices = [(m.id, m.model) for m in Model.query.filter(Model.car_id == orders.cars.id).all()]
    form.version.choices = [(v.id, v.version) for v in Version.query.filter(Version.model_id == orders.models.id).all()]

    form.car.default = orders.cars.id
    form.model.default = orders.models.id
    form.version.default = orders.versions.id
    form.customer_name.default = orders.customer_name
    form.process()

    return render_template('edit_order.html', title="Edit Orders", form=form)

我在表单字段中设置默认数据,并使用form.process()调用构造函数并在selectField中给出选定的值。

您可以在我的github 中获取所有代码。

编码愉快。

【讨论】:

【参考方案2】:

您好 Sukma Saputra,您使用什么来生成 EDIT 页面中的视图 + 分页和搜索框?

【讨论】:

谢谢你,我在你的 github 仓库看到了 :) 希望你能解决你的问题。【参考方案3】:

我建议您按照这些教程(1、2、3)的顺序进行操作,以便您的应用程序结构可以符合flask application structure best practices,然后您可以相应地重新设计您的应用程序。我试图查看您的代码,但它并不容易理解,所以我不确定我或任何人现在可以提供帮助。

如果您有兴趣使用示例数据填充您的数据库以供最初使用或用于测试,您可以查看this 或this。

注意

base.html 中修复&lt;script type="text/javascript" src=" url_for('static', filename='vendor/jquery/dist/jquery.min.js') "&gt;&lt;/script&gt; 这一行,因为它链接到一个不存在的文件(根据从您的应用程序的github 页面下载的文件)。

还要从文件add_order.htmlindex.htmledit_order.html 中删除这行&lt;!DOCTYPE html&gt;,因为它不是必需的。

【讨论】:

感谢@kellymandem,您的回答对我来说意义重大。但这不能回答我的问题,所以我不接受。我会阅读你建议的链接。请注意您的答案,您可以阅读 README.md 文件来运行 github 的源代码。 @SukmaSaputra 不客气,是的,我确实阅读了README.md 文件,并按照其中的说明在我的机器上本地运行应用程序。

以上是关于Flask WTForms 动态表单依赖项 selectField 未填充在编辑页面中的主要内容,如果未能解决你的问题,请参考以下文章

flask web 表单验证 WTForms

flask-WTForms

flask wtforms组件详解

使用flask和WTForms在一个页面中的多个表单

flask WTForms

Flask 结合wtforms的文件上传表单