在 SQLFORM 工厂中,为什么我的只读复选框字段未选中?

In SQLFORM factory, why is my readonly checkbox field unchecked?

所以这是我的控制器代码:

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" 字段为空,只读字段保留其值。

但是,如果验证失败(例如在 "something" 中没有提交任何内容),则 "some_flag" 复选框未选中 。另一个只读字段 "something_readonly" 保留其值。

一个错误,对吧?我该如何解决这个问题?我可以在视图中禁用 javascript 中的字段,但如果可能的话,我想要一个可以在控制器中完成的解决方案或解决方法。

是的,绝对是一个错误。作为解决方法,在验证失败后,您可以将 input 小部件的 checked 属性设置为 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))