如何在表单中使用web.py动态填充选择框/下拉框?

6 投票
3 回答
3370 浏览
提问于 2025-04-16 09:59

所有的 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)里的选项写死,而是希望在页面被调用时,通过 GET/POST 方法从数据库表中获取选项来填充这个下拉框。

我搜索了几个小时,但在任何地方都找不到相关的提示(谷歌、webpy.org、谷歌讨论组)。

3 个回答

3

我知道这个问题早就有人提过了,但我后来是通过设置值来解决的,像这样:

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

这样做的话,你也可以使用内置的验证功能。如果你愿意的话。我最后在论坛上找到了一个类似的例子,所以这可能在文档里不太显眼。

4

你可以通过给 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 产生名称冲突。

2

我建议你先创建其他的元素和表单,然后在GET/POST的部分按照你的需求创建下拉菜单元素,接着:

# Create copy of the form
form = myform()

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

撰写回答