【问题标题】:Flask-WTF: how pass structered object to formFlask-WTF:如何将结构化对象传递给表单
【发布时间】:2012-10-05 10:17:50
【问题描述】:

我是 python 和烧瓶框架的新手。

我的问题是我必须制作一个编辑页面。所以我需要将所有对象的存在信息传递给一个表单。 详情:

我的对象有这种结构:

class TVChannel(Document):
    __collection__  = 'tvchannels'
    use_dot_notation = True

    structure = {
        '_id'           : basestring,
        'name'          : unicode,
        'streams'       : {
            'city1': { 
                'adapt' : basestring,
                'hds'   : basestring,
                'hls'   : basestring,
                'rtmp'  : basestring,
            },       
            'city2':  {
                'adapt' : basestring,
                'hds'   : basestring,
                'hls'   : basestring,
                'rtmp'  : basestring,
            }
        }
    }

在视图中:

channel_obj = db.TVChannel().get_id(channel_id) #load a channel's datas into an object from db
channel     = ChannelForm(request.form, obj=channel_obj) #load channel form

return render_template('channel/new.html',form=channel, channel_id=channel_id)

他们理解并像往常一样传递通道对象的“名称”。但是“流”,他们没有识别并将其传递给这样的东西:

class ChannelForm(Form):    
    _id         = HiddenField()
    name        = TextField(_('channel name'))    
    streams = {
        'city1': { 
            'adapt' : TextField(_('stream adapt link')),
            'hds'   : TextField(_('stream hds link')),
            'hls'   : TextField(_('stream hls link')),
            'rtmp'  : TextField(_('stream rtmp link')),
        },       
        'city2':  {
            'adapt' : TextField(_('stream adapt link')),
            'hds'   : TextField(_('stream hds link')),
            'hls'   : TextField(_('stream hls link')),
            'rtmp'  : TextField(_('stream rtmp link')),
        }
    }

    submit      = SubmitField(_('Save'))

我该怎么办? 或者有没有办法修改对象的数据传递到表单的那些参数的方式?

【问题讨论】:

    标签: python flask wtforms


    【解决方案1】:

    您可以使用wtforms.fields.FormField 使用嵌套表单。在你的情况下,它会是这样的:

    class CitiForm(Form):
        adapt = TextField(_('stream adapt link'))
        hds = TextField(_('stream hds link'))
        hls = TextField(_('stream hls link'))
        rtmp = TextField(_('stream rtmp link'))
    
    class ChannelForm(Form):
        _id = HiddenField()
        name = TextField(_('channel name'))
        city1 = FormField(CitiForm)
        city2 = FormField(CitiForm)
    

    【讨论】:

    • 感谢您的回复。但仍然存在一个主要问题,即我无法预先填充从 channelObject 获取的数据。我的意思是这段代码: channel = ChannelForm(request.form, obj=channel_obj) #load channel form The datas from 'streams' could not be pass into form
    【解决方案2】:

    在文档中很好地找到了这个,我现在将使用它:

    在视图中:

    channel_obj = db.TVChannel().get_id(channel_id) #load a channel's infos into an object
    channel     = ChannelForm(request.form, obj=channel_obj) #load channel form
    channel.CITY1adapt.process_data(channel_obj.streams['City1']['adapt'])
    #and others links
    

    形式如下:

    class ChannelForm(Form):    
        _id         = HiddenField()
        name        = TextField(_('channel name'))    
        CITY1adapt  = TextField(_('adapt link')) 
        CITY2adapt  = TextField(_('adapt link'))
        #and so on
    
        submit      = SubmitField(_('Save'))
    

    现在我正在“保存”它们。

    【讨论】:

      猜你喜欢
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多