2013-10-11 4 views
0

Я хочу создать твитер-бутстрап, соответствующий форме. Согласно docs for Twitter Bootstrap v2.2.2 (версия в комплекте с web2py) HTML, должен выглядеть следующим образом:Создать повторяющиеся поля пользовательской формы в web2py?

<form class="form-horizontal"> 
    <div class="control-group"> 
     <label class="control-label" for="inputEmail">Email</label> 
     <div class="controls"> 
      <input type="text" id="inputEmail" placeholder="Email"> 
     </div> 
    </div> 
... 

Я в настоящее время использую SQLFORM, который выводит HTML, который не очень подходит с этим (даже при использовании formstyle='divs'). Кроме того, я хочу, чтобы мой вывод html был чистым без артефактов web2py, таких как class="w2p_fl". Поэтому я думал использовать пользовательскую форму. Однако при этом будет много повторяющегося кода. То есть в каждом поле необходимо будет повторить следующее.

{{=form.custom.begin}} 
<div class="control-group"> 
    {{=LABEL(form.custom.label['myfield'], _class='control-label', 
     _for='mytable_myfield')}} 
    <div class="controls">{{=form.custom.widget.myfield}}</div> 
</div> 
... 
{{=form.custom.end}} 

Так как я могу повторить вышеописанную блок кода, так что я мог бы заменить его чем-то вроде {{= bootstrap_field (db.mytable.myfield)}} или какой-либо другой способ придерживаться DRY?

Что такое способ web2py для этого? Создать функцию просмотра? Передавать функцию в словаре, возвращаемом контроллером? Создайте свой собственный html-помощник? Создайте собственный виджет? Другой путь?

ответ

3

Если вы используете Bootstrap 2, вы можете просто сделать:

form = SQLFORM(..., formstyle='bootstrap') 

Для Bootstrap 3 (или любой другой обычай FormStyle вы хотите создать), то formstyle аргумент может быть функцией (или другой вызываемый), который создает форму DOM. Функция будет передана форме и объекту fields, который представляет собой список кортежей, с каждым кортежем, содержащим идентификатор CSS, метку, элемент ввода и (возможно, пустой) комментарий/текст справки. Чтобы получить представление о том, как должна выглядеть такая функция, посмотрите the one used for Bootstrap 2 forms.

+0

Отлично! Странный стиль формы «bootstrap» нигде в документации, которую я могу найти. Также я увидел, что formleyle может быть вызван в документации: 'formstyle также может быть функцией, которая принимает (record_id, field_label, field_widget, field_comment) как атрибуты и возвращает объект TR(). Но поскольку он сказал' TR' и Мне не нужен стол, который я понял, что он не может делать то, что я хотел. – User

+0

Все в моем ответе недокументировано. Текст, который вы процитировали из книги, устарел - это все равно будет работать, но теперь вы можете передать вызываемый код, который генерирует всю форму DOM, а не только отдельные объекты TR (код рамки проверяет вашу функцию для определения будь то унаследованный тип или новый тип, исходя из того, сколько аргументов требуется - если он принимает 4 аргумента, он предполагает, что это устаревшая функция). – Anthony

+0

Также меня все равно интересует более буквальный ответ на мой вопрос о том, как обрабатывать повторяемый блок кода (кроме функции formstyle), если у вас есть ответ для редактирования. – User

Смежные вопросы