1

尝试为变形 2、滤锅 1.0 制作一个带有两个选项卡(命令式)的表单。表单的想法是在手动添加网页及其标题之间进行选择,或者选择一个提要 URL:

@property
def webpage_form(self):
    schema = colander.SchemaNode(colander.Mapping(unknown='preserve'),
                                 name="webpage_schema")

    schema_page = colander.SchemaNode(colander.Mapping(unknown='preserve'),
                title=u"Webpage", missing={})
    webpage_name = colander.SchemaNode(
        colander.String(),
        name='webpage_name',
        default=u'Webpage',
        missing=u'',
    )
    webpage_url = colander.SchemaNode(
        colander.String(),
        name='url',
        default=u'-',
        missing=u'',
    )

    schema_page.add(webpage_name)
    schema_page.add(webpage_url)

    schema_feed = colander.SchemaNode(colander.Mapping(unknown='preserve'), 
                title=u"Feed", missing={})
    feed = colander.SchemaNode(
        colander.String(),
        name='feed_url',
        default=u'-',
        missing=u'',
    )

    schema_feed.add(feed)

    schema.add(schema_page)
    schema.add(schema_feed)
    return deform.Form(schema, buttons=('submit',))

在表单控制器(金字塔)中:

controls = request.POST.items()
...
appstruct = self.webpage_form.validate(controls)

虽然控件似乎有数据:

  [('_charset_', u'UTF-8'),
  ('__formid__', u'deform'),
  ('__start__', u':mapping'),
  ('webpage_name', u'Webpage'),
  ('url', u'http://slashdot.org'),
  ('__end__', u':mapping'),
  ('__start__', u':mapping'),
  ('feed_url', u'-'),
  ('__end__', u':mapping'),
  ('submit', u'submit')]

appstruct 为空:

  {'': {}}

尝试了标题,缺失,默认,未知参数,没有结果。表格有什么问题?

此外,不是两个选项卡,而是两个后续字段集,但这可能是另一回事。

4

1 回答 1

0

解决了这个问题。该name参数必须与 一起使用colander.SchemaNode,而不是title。生成的 appstruct 如下所示:

{'feed': {'feed_url': u''},
 'webpage': {'url': u'http://slashdot.org', 'webpage_name': u'Slashdot'}}

这是预期的。

它有助于再次阅读文档

每个模式节点对象都有一个必需的类型,一个用于在反序列化后调整数据的可选准备器,一个用于反序列化准备数据的可选验证器,一个可选的默认值,一个可选的缺失,一个可选的标题,一个可选的描述,以及一个可选的稍少的名称

于 2015-05-27T09:52:51.013 回答