python - 当对象与表单字段名称不匹配时,在 Flask 视图中填充 WTForm FormField
问题描述
我有一个这样的表单设置:
class AddressForm(FlaskForm):
line1 = StringField()
city = StringField()
postcode = StringField()
class PlaceForm(FlaskForm):
name = StringField()
address = FormField(AddressForm)
然后我有一个类似这样的 Flask 视图:
@bp.route("/places/<ident>", methods=['GET', 'POST'])
def edit_place(ident):
place = api.get_place(ident)
form = PlaceForm(obj=place)
if form.validate_on_submit():
# do stuff with the form data
return render_template('place/edit.html', form=form)
返回的api.get_place(ident)
数据与我的类中字段名称的形状不匹配Form
,因此我的表单在浏览器中呈现时始终为空。例如,来自 API 的响应可能如下所示:
{
"place": {
"place_name": "Foobar",
"address": {
"address1": "500 5th St",
"locality": "San Francisco",
"post_code": "90210"
}
}
}
如何自定义代码PlaceForm
在传入时填充数据obj
?
解决方案
我不能完全确定这是否真的是你想要的模式。既然edit_place
有 GET 和 POST 方法,你真的想在这两种情况下都从api.get_place()
函数中填充表单,可能会覆盖请求中的数据吗?
无论如何,您可以尝试以下方法:
class PlaceForm(FlaskForm):
name = StringField()
address = FormField(AddressForm)
def __init__(self, *kwargs):
super().__init__()
self.address, self.name = # some code to populate with data from kwargs
推荐阅读
- javascript - 无法使用 AngularJS 1 在 routeProvider 中使用查询参数进行路由
- java - 根据正确的月份在 ListView 中显示值
- python - 为指定的 n 创建所有布尔组合
- php - Braintree 使用测试信用卡进行 3D 安全交易
- javascript - JavaScript 变量 - 最佳性能
- java - 从文本文件读取无法正常工作
- c# - 分配驱动器号后是否可以禁止 Windows 通知
- amazon-web-services - AWS - 多个 ObjectCreate 的单一电子邮件通知
- javascript - JavaScript:NaN 的值是多少
- java - Hibernate 很难使用 MySQL 创建表