我有一个表单字段(带标签" person1")。我想添加更多相同类型的字段来添加更多人。如何通过单击按钮在web2py表单中动态添加特定字段?
答案 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”数据类型,所有这些都是可能的。