web2py中SQLFORM小部件输入的自定义CSS类

3 投票
1 回答
5184 浏览
提问于 2025-04-17 09:10

在控制器中有这个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'))

这种方法会影响所有包含这个字段的表单(除非你在创建表单之前明确地移除或替换这个控件)。

撰写回答