Pylons FormEncode с массивом элементов формы

У меня есть приложение Pylons, и я использую FormEncode и HtmlFill для обработки моих форм. У меня есть массив текстовых полей в моем шаблоне (Мако)

  
    Метраж
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
    ${h.text('yardage[]', maxlength=3, size=3)}
  

Тем не менее, я не могу понять, как проверить эти поля. Вот соответствующая запись из моей схемы

yardage = formencode.ForEach(formencode.validators.Int())

Я пытаюсь проверить, что каждое из этих полей является Int. Однако для этих полей проверка не выполняется.

ОБНОВЛЕНИЕ Как требуется, здесь приведен код для действия этого контроллера. Я знаю, что это работает, так как я могу проверить другие поля формы.

    def submit (self): schema = CourseForm () try: c.form_result = schema.to_python (dict (request.params)), кроме formencode.Invalid, error:
            c.form_result = error.value
            c.form_errors = error.error_dict или {}
            c.heading = 'Добавить курс'
            html = render('/ производная /course/add.html') вернуть htmlfill.render(
                html,
                defaults = c.form_result,
                errors = c.form_errors)
        else:
            h.redirect_to(controler='course', action='view')

ОБНОВЛЕНИЕ На IRC было предложено изменить название элементов с yardage[] в yardageБезрезультатно. Все они должны быть целыми числами, но вставка f в один из элементов не делает его недействительным. Как я уже говорил, я могу проверить другие поля формы. Ниже вся моя схема.

импорт форменкода

Класс CourseForm(formencode.Schema):
    allow_extra_fields = True
    filter_extra_fields = True
    name = formencode.validators.NotEmpty(messages={'empty': 'Имя не должно быть пустым'})
    par = formencode.ForEach(formencode.validators.Int())
    yardage = formencode.ForEach(formencode.validators.Int())

2 ответа

Решение

Оказывается, то, что я хотел сделать, было не совсем правильно.

Шаблон:

<tr>
  <td>Yardage</td>
  % for hole in range(9):
  <td>${h.text('hole-%s.yardage'%(hole), maxlength=3, size=3)}</td>
  % endfor
</tr>

(Для начала нужно было сделать это в цикле.) Вы заметите, что имя первого элемента станет hole-1.yardage, Я тогда буду использовать FormEncode.variabledecode превратить это в словарь. Это сделано в

Схема:

import formencode

class HoleSchema(formencode.Schema):
    allow_extra_fields = False
    yardage = formencode.validators.Int(not_empty=True)
    par = formencode.validators.Int(not_empty=True)

class CourseForm(formencode.Schema):
    allow_extra_fields = True
    filter_extra_fields = True
    name = formencode.validators.NotEmpty(messages={'empty': 'Name must not be empty'})
    hole = formencode.ForEach(HoleSchema())

HoleSchema подтвердит, что hole-#.par а также hole-#.yardage оба целые и не пустые. formencode.ForEach позволяет мне применять HoleSchema в словарь, который я получаю от прохождения variable_decode=True к @validate декоратор.

Здесь submit действие от моего

Контроллер:

@validate(schema=CourseForm(), form='add', post_only=False, on_get=True, 
          auto_error_formatter=custom_formatter,
          variable_decode=True)
def submit(self):
    # Do whatever here.
    return 'Submitted!'

С использованием @validate Декоратор позволяет гораздо более чистый способ проверки и заполнения форм. variable_decode=True очень важно, иначе словарь не будет создан должным образом.

c.form_result = schema.to_python(request.params) - (without dict)

Кажется, работает нормально.

Другие вопросы по тегам