Как динамически заполнить selectbox / dropdownbox в форме, используя web.py?
все web.py примеры форм приведены в следующем формате (от webpy.org):
myform = form.Form(
form.Textbox("boe"),
form.Textbox("bax",
form.notnull,
form.regexp('d+', 'Must be a digit'),
form.Validator('Must be more than 5', lambda x:int(x)>5)),
form.Textarea('moe'),
form.Checkbox('curly'),
form.Dropdown('french', ['mustard', 'fries', 'wine']))
class index:
def GET(self):
form = myform()
# make sure you create a copy of the form by calling it (line above)
# Otherwise changes will appear globally
return render.formtest(form)
def POST(self):
form = myform()
if not form.validates():
return render.formtest(form)
else:
# form.d.boe and form['boe'].value are equivalent ways of
# extracting the validated arguments from the form.
return "Grrreat success! boe: %s, bax: %s" % (form.d.boe, form['bax'].value)
Я не хочу заполнять раскрывающийся список (форма.Раскрывающийся список в приведенном выше примере) статический при объявлении формы, но в методе GET/POST с использованием записей, полученных из таблицы базы данных при вызове страницы.
Я искал пару часов, но не могу найти подсказку нигде (google, webpy.org, google группы)
3 ответов
Я предлагаю вам создать другие элементы и форму, затем в GET / POST создайте раскрывающийся элемент, как вы хотите, и:
# Create copy of the form
form = myform()
# Append the dropdown to the form elements.
form.inputs = tuple(list(form.inputs) + [mydropdown])
вы можете объявить форму, передав пустой список в form.Dropdown
args, а затем установить args
в коде.
# form declaration
MyForm = form.Form(form.Dropdown("french", []))
# then in your controller
my_form = MyForm()
my_form.french.args = ['mustard', 'fries', 'wine']
также, пожалуйста, не используйте form
для переменной, из-за столкновения имени с web.form
.
Я знаю, что это было опубликовано некоторое время назад, но я сделал это, установив впоследствии значение, например:
form = input_form()
form.get('some_input').value = _id
return render.some_template(form)
Это позволяет вам также использовать встроенную проверку, если вам угодно. Я закончил тем, что нашел такой пример на досках, поэтому, вероятно, это своего рода похороненная документация.