在kid页面中自动帮你选择checkbox或radio框
在很多系统中,我们需要让页面记住我们的选择框,如调查问卷,试题选择页面,在分页提交后,回来仍能显示你以前的选择。
步骤是,(1)提交当前页面选择到数据库中,同时保存到session中,(2)如果回到原来页面,判断session中有无值,有,根据其中的值,自动帮你选好。
我们只是关注把值传到页面中,看看在kid模板中如何自动实现。
原理其实非常简单
默认选择
默认不选择
1.新建turbogears项目,
d:/project>tg-admin quickstart AutoCheckbox
默认回车两次,自动生成所需要的目录结构。
d:/project>cd AutoCheckbox.
2.在controllers.py中,
class Root(controller.RootController):
@expose("autocheckbox.templates.abc")
def ret(self):
items = "ABCD"
items_selected="AB"
return dict(items=items,items_selected=items_selected)
我们可以通过在浏览器访问http://lcoalhost:8080/ret来查看结果。
把items和items_selected传入到tempaltes.abc模板中,下一步在指定的目录下生成模板。
进入templates目录。为简单起见,直接copy目录下的,welcome.kid => abc.kid
..>cd templates
..>copy welcome.kid abc.kid
3.在abc.kid中,删除之间的内容。添加所需的内容。
body>
input type="checkbox" checked=""/> -->
/body>
或者
body>
input type="checkbox" checked=None/>
/body>
看到了吧,关键在于
对于kid模板来说,如果标签的属性如checked="",在编译生成xhtml时保留它为checked="True",
如果checked=None,则在编译时,会去掉这个属性。
所以在我们自动选择的项,checked="", 否则checked=None, 就这么简单。
我们有两种方式来实现它。
(1)直接利用checked=${(None,'')[True or False]}
(None,'')[boolean value]
能看懂吗,如果你直接在python交互式环境中输入,其实就明白了,
在python中,[False]==>[0], [True]==>[1]
(None,'')[0] = None, (None,'')[1] == ''。这下明白了?
checked=${(None,'')[True or False]}
如果[True], checked=""
如果[False], checked=None
所以页面代码为
value="${item}
checked="${(None,'')[item in items_selected]}">${item}
简单解释下,
py:for,py:strip, pycontent是kid中的xml方法,py:for类似于python中的for用法,${expression},kid把出现${}地方用其中的expression表达式替换。
用py:for取出ABCD中的每一个给item。判断item in items_selected(AC)中,如果在其中,checked='',不在其中的话checked=None.
另外一种方式在kid中。在py:attrs="checked=..."
def checker(bool):
return '' if bool else None
?>
value="${item}
py:attrs="checked=checker(item in items_selected)">${item}