Пользовательские классы CSS для ввода виджета SQLFORM в web2py - PullRequest
3 голосов
/ 29 декабря 2011

Учитывая эту 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'))

как применить пользовательские классы CSS для каждого виджета формы <input> элемент?

  {{=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 голосов
/ 29 декабря 2011

Обратите внимание, что у всех виджетов уже есть класс, названный для типа виджета (например, "строка", "целое число", "дата" и т. Д.), А также идентификатор в виде "tablename_fieldname", так что вы можетеиметь возможность использовать их в своем 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'))

Этот метод повлияет на все формы, которые включают это поле (если вы явно не удалите или не замените виджет перед созданиемформа).

...