Pylons FormEncode com uma matriz de elementos de formulário
Eu tenho um aplicativo Pylons e estou usando FormEncode e HtmlFill para manipular meus formulários. Eu tenho uma matriz de campos de texto no meu modelo (Mako)
<tr> <td>Yardage</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> <td>${h.text('yardage[]', maxlength=3, size=3)}</td> </tr>
No entanto, não consigo descobrir como validar esses campos. Aqui está a entrada relevante do meu esquema
yardage = formencode.ForEach(formencode.validators.Int())
Estou tentando validar que cada um desses campos é um Int. No entanto, nenhuma validação ocorre para esses campo
ATUALIZA Conforme solicitado aqui, está o código para a ação deste controlador. Sei que estava funcionando, pois posso validar outros campos do formulári
def submit(self): schema = CourseForm() try: c.form_result = schema.to_python(dict(request.params)) except formencode.Invalid, error: c.form_result = error.value c.form_errors = error.error_dict or {} c.heading = 'Add a course' html = render('/derived/course/add.html') return htmlfill.render( html, defaults = c.form_result, errors = c.form_errors ) else: h.redirect_to(controler='course', action='view')
ATUALIZA Foi sugerido no IRC que eu mude o nome dos elementos deyardage[]
parayardage
Sem resultado. Todos devem ser ints, mas inserir f em um dos elementos não faz com que ele seja inválido. Como eu disse antes, sou capaz de validar outros campos do formulário. Abaixo está todo o meu esquema.
import formencode class CourseForm(formencode.Schema): allow_extra_fields = True filter_extra_fields = True name = formencode.validators.NotEmpty(messages={'empty': 'Name must not be empty'}) par = formencode.ForEach(formencode.validators.Int()) yardage = formencode.ForEach(formencode.validators.Int())