Flask WTForms 动态表单依赖项 selecField 未填充在编辑页面中
Flask WTForms dynamic forms dependencies selecField not populate in edit page
我有要在编辑页面中重新填充的表单,在我的表单中,我有三个 selectField,它们相互关联以进行填充。但是我的第一个 selectField (Cars) 在编辑页面重新填充后没有选择正确的值并且我的代码没有错误。
这是我的场景,当我在 table 中单击编辑时。数据将以编辑形式填充。但是 Car selectedField 没有选择正确的汽车。见下图...
如何在编辑页面中重新填充数据并在 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。
我希望有人可以修复我的 bugs/error。
感谢进阶。
我可以建议您遵循这些教程(1, 2, 3 ) in their order so your application structure can comply with flask application structure best practices,然后您可以相应地重新设计您的应用程序。我试图查看您的代码,但它并不容易理解,所以我不确定我或任何人现在可以提供帮助。
如果您有兴趣用样本数据填充数据库以供最初使用或用于测试,您可以查看 this or this。
注意
修复 base.html
中的这一行 <script type="text/javascript" src="{{ url_for('static', filename='vendor/jquery/dist/jquery.min.js') }}"></script>
,因为它链接到一个不存在的文件(根据从您的应用程序的 github 页面下载的文件)。
并从文件 add_order.html
、index.html
和 edit_order.html
中删除这一行 <!DOCTYPE html>
,因为它不是必需的。
您好 Sukma Saputra,您使用什么在编辑页面中生成视图 + 分页和搜索框?
我从那里得到了答案。
这是我的更新代码,用于在我的编辑页面中填充依赖项 wtforms selecField。
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.
中获取
编码愉快。
我有要在编辑页面中重新填充的表单,在我的表单中,我有三个 selectField,它们相互关联以进行填充。但是我的第一个 selectField (Cars) 在编辑页面重新填充后没有选择正确的值并且我的代码没有错误。
这是我的场景,当我在 table 中单击编辑时。数据将以编辑形式填充。但是 Car selectedField 没有选择正确的汽车。见下图...
如何在编辑页面中重新填充数据并在 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。 我希望有人可以修复我的 bugs/error。 感谢进阶。
我可以建议您遵循这些教程(1, 2, 3 ) in their order so your application structure can comply with flask application structure best practices,然后您可以相应地重新设计您的应用程序。我试图查看您的代码,但它并不容易理解,所以我不确定我或任何人现在可以提供帮助。
如果您有兴趣用样本数据填充数据库以供最初使用或用于测试,您可以查看 this or this。
注意
修复 base.html
中的这一行 <script type="text/javascript" src="{{ url_for('static', filename='vendor/jquery/dist/jquery.min.js') }}"></script>
,因为它链接到一个不存在的文件(根据从您的应用程序的 github 页面下载的文件)。
并从文件 add_order.html
、index.html
和 edit_order.html
中删除这一行 <!DOCTYPE html>
,因为它不是必需的。
您好 Sukma Saputra,您使用什么在编辑页面中生成视图 + 分页和搜索框?
我从
这是我的更新代码,用于在我的编辑页面中填充依赖项 wtforms selecField。
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.
中获取编码愉快。