如何在web2py表单中动态添加字段?

时间:2016-06-13 21:02:16

标签: web2py

我有一个表单字段(带标签" person1")。我想添加更多相同类型的字段来添加更多人。如何通过单击按钮在web2py表单中动态添加特定字段?

3 个答案:

答案 0 :(得分:0)

喜欢这个? http://www.web2py.com/books/default/chapter/29/11/jquery-and-ajax#Conditional-fields-in-forms

我想添加类似于webapp的东西,我没有代码显示atm因为不是我的第一优先级,涉及不同的表,我想我需要使用SQLFORM.factory,自定义字段设置为css display:默认为none。然后我将使用jquery按需显示它们并最终将所有内容写入DB。

但是这本书上的例子似乎是开始探索的好方法。

无论如何,如果在表单的字段中的字段尝试这个...

这在一个模型中:

db.define_table("people", Field("person", "string"), format='%(person)s')

这在控制器中:

def add_person():
    form = SQLFORM.factory(db.people,
        buttons=[INPUT(_type = 'submit', _name = 'submit', 
                 _value = 'Submit', _class = "btn-submit"),
                 INPUT(_type = 'button', _value = 'Add field', 
                 _onClick = "$('<input type=text>').insertAfter(':input.string');", 
                 _class = "btn-warning")])
    if form.process().accepted:
        #do something
        pass
    elif form.errors:
        response.flash = 'Errors on form'
    return dict(form=form)

上面的代码动态添加了字段,但后来看起来很复杂,需要检索值并插入数据库,我想这就是你想要做的。

我认为以下解决方案应该可行,只需将所需字段的数量作为参数传递,并在提交时插入所有字段。

如果我不明白你的要求,请解释一下。

def add_person():
    fields = []
    for i in range(int(request.args(0) or 1)):
        fields.append(Field('person ' + str(i),
                      default='text ' + str(i)))

    form = SQLFORM.factory(*fields)
    if form.process().accepted:
        fields = [item[1] for item in form.vars.iteritems() 
                  if item[0].startswith('person')]
        for field in fields:
            db.people.insert(person=field)
    return dict(form=form)

答案 1 :(得分:0)

无法自动将字段添加到表单中。应该手动完成 字段(&#39;名称&#39;,标签=&#39;&#39;,widget =&#39;&#39;)。这样,您可以向表单添加字段

答案 2 :(得分:0)

Web2py使您可以轻松地执行此操作。唯一的让步是,每次使用该表格时,您最终都会在一条记录中得到一个人员列表。

如果这适合您,则将模型更改为此:

db.define_table("people", Field("person", "list:string"), format='%(person)s')

在您的控制器中:

def add_persons():
    form = SQLFORM(db.people)
    if form.process().accepted:
        #do something
        pass
    elif form.errors:
        response.flash = 'Errors on form'
    return dict(form=form)

在视图模板中:

{{=form}}

这将显示带有单个字段的表格,旁边带有+和-按钮。 每当您添加一些文本并单击+按钮或在键盘上按Enter时,都会在现有文本框下方添加一个新的空白表单字段。

由于SQLFORM如何处理“ list:string”数据类型,所有这些都是可能的。