#web2py
#web2py
Вопрос:
Я использую пользовательские радиокнопки с SQLFORM, как показано ниже:
def radioboxes(field,value):
items=[DIV(name,INPUT(_type='radio',_value=key,_name=field.name,value=value), _class='radio')
for key,name in field.requires.options() if key]
return items
db.define_table('table1',
Field('name', 'string', length=16, required=True, unique=True, ),
Field('shape', 'string', length=12, default='star', widget=radioboxes, requires=IS_IN_SET(shapes)))
Я использую это для редактирования таблицы
record = db.table1(session.table1_id)
form = SQLFORM(db.table1, record, fields=['name', 'shape'], showid=False, deletable=True, delete_label='Delete', col3=col3) # edit/delete
Это работает отлично, за исключением случаев, когда в форме возникает ошибка — если я использую неуникальное значение для поля name, я получаю ожидаемое сообщение об ошибке, но переключатели больше не отображаются корректно — они отображаются как:
[<gluon.html.DIV object at 0x08C9F850>, <gluon.html.DIV object at 0x08C9F130>, <gluon.html.DIV object at 0x08C9FFD0>, <gluon.html.DIV object at 0x08C9F070>, <gluon.html.DIV object at 0x08C9FD10>, <gluon.html.DIV object at 0x08C9F8F0>, <gluon.html.DIV object at 0x08C9FE10>, <gluon.html.DIV object at 0x08C9FF90>, <gluon.html.DIV object at 0x08C9FE90>, <gluon.html.DIV object at 0x08C9F6B0>, <gluon.html.DIV object at 0x08C9F610>]
Как я могу это исправить?
Комментарии:
1. Я исправил это, заключив сгенерированные переключатели в их собственные div: def radioboxes (поле, значение): items=[DIV (имя, ВВОД (_type=’radio’,_value = ключ,_name=field.name ,значение=value), _class=’radio’) для ключа,имя в поле.требуется.options() если ключ] возвращает DIV(*элементы) (добавлен DIV в возврат)
2. Да, ваш виджет должен возвращать один вспомогательный объект HTML, а не список вспомогательных объектов. Кроме того, если вы хотите, чтобы ‘name’ было уникальным, вам следует добавить
requires=IS_NOT_IN_DB(db, 'table1.name')
.unique=True
Применяется базой данных, а не формой, поэтому неуникальное имя вызовет ошибку базы данных, но не выдаст правильную ошибку формы при проверке формы.
Ответ №1:
Я исправил это, заключив сгенерированные переключатели в их собственный div:
def radioboxes(field,value):
items=[DIV(name,INPUT(_type='radio',_value=key,_name=field.name,value=value), _class='radio')
for key,name in field.requires.options() if key]
return DIV(*items)
(добавлен DIV в возвращаемом файле)