首页 > 解决方案 > 当对象与表单字段名称不匹配时,在 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

标签: pythonflaskflask-wtformswtforms

解决方案


我不能完全确定这是否真的是你想要的模式。既然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

推荐阅读