2

我有一个 Pylons 应用程序,并且正在使用 FormEncode 和 HtmlFill 来处理我的表单。我的模板中有一组文本字段(Mako)

  <tr>
    <td>码数</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
    <td>${h.text('码数[]', maxlength=3, size=3)}</td>
  </tr>

但是,我似乎无法弄清楚如何验证这些字段。这是我的架构中的相关条目

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

我正在尝试验证这些字段中的每一个都是 Int。但是,不会对这些字段进行验证。

更新 这里要求的是这个控制器的操作代码。我知道它正在工作,因为我可以验证其他表单字段。

    def 提交(自我):
        架构 = CourseForm()
        尝试:
            c.form_result = schema.to_python(dict(request.params))
        除了formencode.Invalid,错误:
            c.form_result = error.value
            c.form_errors = error.error_dict 或 {}
            c.heading = '添加课程'
            html = render('/derived/course/add.html')
            返回 htmlfill.render(
                html,
                默认值 = c.form_result,
                错误 = c.form_errors
                )
        别的:
            h.redirect_to(controler='course', action='view')

更新 IRC 建议我将元素的名称从更改yardage[]yardage 无结果。它们都应该是整数,但将 f 放入其中一个元素不会导致它无效。正如我之前所说,我能够验证其他表单字段。下面是我的整个架构。

导入表单代码

课程表类(formencode.Schema):
    allow_extra_fields = 真
    filter_extra_fields = 真
    name = formencode.validators.NotEmpty(messages={'empty': '名称不能为空'})
    par = formencode.ForEach(formencode.validators.Int())
    码数 = formencode.ForEach(formencode.validators.Int())
4

2 回答 2

5

原来我想做的不太对。

模板

<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否则将无法正确创建字典。

于 2009-06-16T23:56:40.150 回答
1
c.form_result = schema.to_python(request.params) - (without dict)

它似乎工作正常。

于 2010-10-26T15:26:00.733 回答