首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将自定义对象传递给WTForm

将自定义对象传递给WTForm
EN

Stack Overflow用户
提问于 2016-12-16 12:33:24
回答 2查看 3.1K关注 0票数 2

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

我的初始化:

代码语言:javascript
运行
复制
form = EditEventForm(event)

我的表格课:

代码语言:javascript
运行
复制
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)

但是很明显,表单不能访问自上下文。还有其他方法可以实现它,这样我的字段就可以从传递的对象中读取数据了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-16 12:46:06

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

代码语言:javascript
运行
复制
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()])

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

代码语言:javascript
运行
复制
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

编辑

正如注释中所建议的,上述模式是不好的,因为当模型或表单对象被更改时,必须跟踪表单创建的所有实例。你可以用这样的东西来代替:

代码语言:javascript
运行
复制
# 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)

来自文档

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

票数 7
EN

Stack Overflow用户

发布于 2016-12-16 13:02:23

来自the FineManual

init(formdata=None,obj=None,前缀=‘’,data=None,meta=None,**kwargs)参数: (...)obj -如果表单数据为空或未提供,则将检查此对象是否具有与表单字段名匹配的属性,这些属性将用于字段值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41184522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档