将自定义对象传递给 WTForm
Pass custom object to WTForm
我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示:
我的初始化:
form = EditEventForm(event)
还有我的表格 class:
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)
但显然,表单无法访问自身上下文。有没有其他方法可以实现它,以便我的字段可以从传递的对象中读取数据?
如果您的任务只是用默认数据填充表单,您可以这样做:
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)
Note: This is a destructive operation; Any attribute with the same name as a field will be overridden. Use with caution.
init(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs)
Parameters:
(...)
obj – If formdata is empty or not provided, this object is checked for attributes matching form field names, which will be used for field values.
我需要将一个对象从我的数据库传递到我的表单,我想从中读取默认值。我当前的代码如下所示:
我的初始化:
form = EditEventForm(event)
还有我的表格 class:
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)
但显然,表单无法访问自身上下文。有没有其他方法可以实现它,以便我的字段可以从传递的对象中读取数据?
如果您的任务只是用默认数据填充表单,您可以这样做:
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)
Note: This is a destructive operation; Any attribute with the same name as a field will be overridden. Use with caution.
init(formdata=None, obj=None, prefix='', data=None, meta=None, **kwargs) Parameters:
(...) obj – If formdata is empty or not provided, this object is checked for attributes matching form field names, which will be used for field values.