所以这是我的控制器代码:
form = SQLFORM.factory(Field("something_readonly", writable=False, default="can't change")
,Field("something", requires=IS_LENGTH(10,5))
,Field("some_flag", "boolean", writable=False, default=True))
if form.process().accepted:
print("validate")
return dict(form=form)
当我成功提交时,一切都显示出我的期望;也就是说,“something”字段为空,只读字段保留其值。
但是,如果验证失败(例如在“某事”中没有提交任何内容),则取消选中“some_flag”复选框。另一个只读字段“something_readonly”保留其值。
一个错误,对吗?我怎么能绕过这个?我可以在视图中禁用javascript中的字段,但我想要一个可以在控制器中完成的解决方案或解决方法,如果可能的话。
答案 0 :(得分:1)
是的,绝对是个错误。作为解决方法,在验证失败后,您可以将checked
窗口小部件的input
属性设置为True
:
def fix_booleans(form):
for fieldname in form.fields:
field = form.table[fieldname]
if field.type == 'boolean' and field.writable == False and field.default == True:
form.custom.widget[fieldname]['_checked'] = True
form.process(onvalidation=dict(onfailure=fix_booleans))