Схема Deform 2/colander с двумя вкладками даже не проходит валидацию

Пытаюсь сделать форму с двумя вкладками (в императивном стиле) для деформа 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')]

Структура приложения пуста:

  {'': {}}

Экспериментировал с заголовком, отсутствующим, по умолчанию, неизвестными параметрами, безрезультатно. Что не так с формой?

Кроме того, вместо двух вкладок есть два последовательных набора полей, но это может быть другая история.


person Roman Susi    schedule 26.05.2015    source источник


Ответы (1)


Решил проблему. Параметр name должен использоваться с colander.SchemaNode, а не title. Результирующая структура приложения выглядит следующим образом:

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

что и ожидалось.

Было полезно прочитать документацию еще раз. :

Каждый объект узла схемы имеет обязательный тип, необязательный преобразователь для корректировки данных после десериализации, необязательный валидатор для десериализованных подготовленных данных, необязательный параметр по умолчанию, необязательный отсутствующий, необязательный заголовок, необязательное описание, и немного менее необязательный имя.

person Roman Susi    schedule 27.05.2015