Pylons FormEncode с массивом элементов формы
У меня есть приложение Pylons, и я использую FormEncode и HtmlFill для обработки моих форм. У меня есть массив текстовых полей в моем шаблоне (Мако)
Метраж TD> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> ${h.text('yardage[]', maxlength=3, size=3)} td> TR> Тем не менее, я не могу понять, как проверить эти поля. Вот соответствующая запись из моей схемы
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())2009-06-15 04:042 ответа
Решение2009-06-16 23:56Оказывается, то, что я хотел сделать, было не совсем правильно.
Шаблон:
<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
очень важно, иначе словарь не будет создан должным образом.2010-10-26 15:26c.form_result = schema.to_python(request.params) - (without dict)
Кажется, работает нормально.