bau*_*ack 2 python pylons formencode htmlfill
我有一个Pylons应用程序,并使用FormEncode和HtmlFill来处理我的表单.我的模板中有一系列文本字段(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>
但是,我似乎无法弄清楚如何验证这些字段.这是我的架构的相关条目
yardage = formencode.ForEach(formencode.validators.Int())
我正在尝试验证每个字段都是Int.但是,这些字段不会进行验证.
更新 根据此处的要求,该控制器的操作代码.我知道它正在工作,因为我可以验证其他表单字段.
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')
更新
在IRC上建议我将元素的名称从
No 更改yardage[]为yardageNo result.它们都应该是整数,但是将f放入其中一个元素并不会导致它无效.正如我之前所说,我能够验证其他表单字段.以下是我的整个架构.
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())
原来我想做的事情不太对劲.
模板:
<tr>
<td>Yardage</td>
% for hole in range(9):
<td>${h.text('hole-%s.yardage'%(hole), maxlength=3, size=3)}</td>
% endfor
</tr>
Run Code Online (Sandbox Code Playgroud)
(应该以循环开始.)你会注意到第一个元素的名称将成为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())
Run Code Online (Sandbox Code Playgroud)
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!'
Run Code Online (Sandbox Code Playgroud)
使用@validate装饰器可以更清晰地验证和填写表单.这variable_decode=True非常重要,否则将无法正确创建字典.
| 归档时间: |
|
| 查看次数: |
2673 次 |
| 最近记录: |