Как динамически заполнить selectbox / dropdownbox в форме, используя web.py? - PullRequest
6 голосов
/ 15 января 2011

Все примеры форм 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)

Я не хочу заполнять выпадающий список (form.Dropdown в примере выше) staticпри объявлении формы, но в методе GET / POST с использованием записей, извлеченных из таблицы базы данных при вызове страницы.

Я искал пару часов, но нигде не нашел подсказки (Google, webpy.org, группы google)

Ответы [ 3 ]

4 голосов
/ 09 октября 2012

Вы можете объявить форму, передав пустой список аргументам form.Dropdown, а затем установив 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.

3 голосов
/ 09 октября 2012

Я знаю, что это было опубликовано некоторое время назад, но я сделал это, установив значение впоследствии, как в:

form = input_form()
form.get('some_input').value = _id
return render.some_template(form)

Это позволяет вам также использовать встроенную проверку, если хотите. В итоге я нашел на досках пример, подобный этому, так что это, вероятно, мудрая документация.

2 голосов
/ 16 января 2011

Я предлагаю вам создать другие элементы и форму, затем в GET / POST создайте выпадающий элемент, как вы хотите, и:

# Create copy of the form
form = myform()

# Append the dropdown to the form elements.
form.inputs = tuple(list(form.inputs) + [mydropdown])
...