将自定义对象传递给WTForm

时间:2016-12-16 12:33:24

标签: python python-3.x flask wtforms flask-wtforms

我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我目前的代码如下:

我的初始化:

form = EditEventForm(event)

我的表格类:

class EditEventForm(FlaskForm):
    def __init__(self, event):
        self.event = event

    name = StringField('Name', validators=[DataRequired()],     default=self.event.name)
    description = TextAreaField('Description', validators=[DataRequired()], default=self.event.description)
    street = StringField('Street and number', validators=[DataRequired()], default=self.event.street)
    city = StringField('City', validators=[DataRequired()], default=self.event.city)
    time = StringField('Time', validators=[DataRequired()], default=self.event.time)

但显然,表单无法访问自我上下文。有没有其他方法可以实现它,所以我的字段可以从传递的对象中读取数据?

2 个答案:

答案 0 :(得分:2)

如果您的任务只是使用默认数据填充表单,您可以这样做:

from flask_wtf import Form
from wtforms import StringField, TextAreaField
from wtforms.validators import DataRequired

class EditEventForm(Form):
    name = StringField('Name', validators=[DataRequired()])
    description = TextAreaField('Description', validators=[DataRequired()])
    street = StringField('Street and number', validators=[DataRequired()])
    city = StringField('City', validators=[DataRequired()])
    time = StringField('Time', validators=[DataRequired()])

然后使用所需数据填充新创建的表单

form = EditEventForm()
form.name.data = event.name
form.description.data = event.description
form.street.data = event.street
form.city.data = event.city
form.time.data = event.time

修改

正如评论中所建议的那样,上述模式很糟糕,因为当更改模型或表单对象时,必须跟踪表单创建的所有实例。人们可以使用这样的东西:

# attributes of the event object matching form field names will be used for field values
form = EditEventForm(obj=event)

# populates the attributes of the passed obj with data from the form’s fields
form.populate_obj(event)

来自documentation

  

注意:这是一种破坏性的操作;将覆盖与字段同名的任何属性。请谨慎使用。

答案 1 :(得分:0)

来自the FineManual

  

init (formdata =无,obj =无,前缀='',数据=无,元=无,** kwargs)   参数:
     (......)      obj - 如果formdata为空或未提供,则检查此对象是否存在与表单字段名称匹配的属性,这些属性将用于字段值。