Pylons FormEncode with an array of form elements

浪尽此生 提交于 2019-12-03 04:01:36
baudtack

Turns out what I wanted to do wasn't quite right.

Template:

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

(Should have made it in a loop to begin with.) You'll notice that the name of the first element will become hole-1.yardage. I will then use FormEncode.variabledecode to turn this into a dictionary. This is done in the

Schema:

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())

The HoleSchema will validate that hole-#.par and hole-#.yardage are both ints and are not empty. formencode.ForEach allows me to apply HoleSchema to the dictionary that I get from passing variable_decode=True to the @validate decorator.

Here is the submit action from my

Controller:

@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!'

Using the @validate decorator allows for a much cleaner way to validate and fill in the forms. The variable_decode=True is very important or the dictionary will not be properly created.

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

It seems to works fine.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!