Flask-WTF:如何通过结构化对象来形成

时间:2012-10-05 10:17:50

标签: python flask wtforms

我是python和flask框架的新手。

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

我的对象有这种结构:

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)

他们理解的channel_object的“名称”并像平常一样传递它。但是“流”,他们没有认识到并将其传递给这样的东西:

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'))

我该怎么办? 或者无论如何要修改对象的数据如何传递到表单的那些参数?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

在视图中:

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'))

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

相关问题