web2py中SQLFORM小部件输入的自定义CSS类
在控制器中有这个SQLFORM:
form = SQLFORM.factory(db.source_server, db.target_server)
还有下面这个表的定义:
db.define_table('target_server',
Field('target_url', 'string'),
Field('target_user', 'string'),
Field('target_password', 'password'))
db.define_table('target_server',
Field('target_url', 'string'),
Field('target_user', 'string'),
Field('target_password', 'password'))
我该如何为每个表单控件的 <input>
元素应用自定义的CSS类呢?
{{=form.custom.begin}}
<fieldset>
<legend>Source Server</legend>
<div class="clearfix">
<label for="source_url">URL:</label>
<div class="input">
<input class="bla bla" name="field_name">
</div>
</div>
...
{{=form.custom.end}}
1 个回答
8
注意,所有的控件(widgets)都有一个与控件类型相对应的类名(比如“string”、“integer”、“date”等),同时还有一个格式为“tablename_fieldname”的ID,所以你可以直接在CSS中使用这些,而不需要额外添加自定义类。想了解更多细节,可以查看这里。
如果你需要自定义类名,记住web2py的FORM和SQLFORM对象以及它们的子组件是HTML助手对象,可以像处理其他HTML助手一样进行操作。特别是,这些助手在处理它们的组件时像列表,在处理它们的属性时像字典(比如,输入类是INPUT对象的一个属性)。所以,你可以在创建表单的控制器或者视图中做类似这样的操作:
form.custom.widget.field_name['_class'] = 'bla bla'
如果你需要改变某种类型的所有控件的类名,也可以通过.elements()
搜索功能来实现:
for input in form.elements('input', _class='string'):
input['_class'] = 'my-string'
另外一个选项是明确地为字段定义一个控件,可以在表的定义中使用自定义控件,或者简单地给内置控件传递一个_class
属性:
Field('target_user', 'string', widget = lambda field, value:
SQLFORM.widgets.string.widget(field, value, _class='my-string'))
这种方法会影响所有包含这个字段的表单(除非你在创建表单之前明确地移除或替换这个控件)。