我们有以下表单,我们正在尝试为每个组创建GroupRoleForms列表。
class FullNameMixIn():
full_name = TextField(
'Full name', [
validators.required(message=u"Full name is required")
])
class GroupRoleForm(Form):
group =BooleanField('Group', default=False)
role = SelectField(
'Role',choices=[
("none", "----------"),
('approver', 'Approver'),
('editor', 'Editor')
])
class AdminEditUserForm(Form, FullNameMixIn):
group_roles = FieldList(FormField(GroupRoleForm))如何创建包含预先填充的GroupRoleForms列表的AdminEditUserForm实例
目前,我们正尝试这样做:
form = forms.AdminEditUserForm()
for group in company.groups:
group_role_form = forms.GroupRoleForm()
group_role_form.group.label = group.name
group_role_form.group.name = group.id
form.group_roles.append_entry(group_role_form)
return dict(edit_user_form = form )发布于 2014-05-31 00:42:23
解释
在Form的data或formdata关键字参数中,只需要一个字典,该字典的key必须与包含可迭代变量的FieldList子字段相匹配。该可迭代需求中的项依次具有与FieldList的字段列表匹配的属性的项。
如果你遵循下面的例子,我得到的嵌套表单是预先填充好的。
《守则》
from collections import namedtuple
from wtforms import validators
from wtforms import Form
from wtforms import SelectField
from wtforms import BooleanField
from wtforms import TextField
from wtforms import FieldList
from wtforms import FormField
from webob.multidict import MultiDict
# OP's Code
class FullNameMixIn():
full_name = TextField(
'Full name', [
validators.required(message=u"Full name is required")
])
class GroupRoleForm(Form):
group =BooleanField('Group', default=False)
role = SelectField(
'Role',choices=[
("none", "----------"),
('approver', 'Approver'),
('editor', 'Editor')
])
class AdminEditUserForm(Form, FullNameMixIn):
group_roles = FieldList(FormField(GroupRoleForm))
# create some groups
Group = namedtuple('Group', ['group', 'role'])
g1 = Group('group-1', 'none')
g2 = Group('group-2', 'none')
# drop them in a dictionary
data_in={'group_roles': [g1, g2]}
# Build form
test_form = AdminEditUserForm(data=MultiDict(data_in))
# test print
print test_form.group_roles()呈现的HTML(截断)
<ul id="group_roles">
<li>
<label for="group_roles-0">Group Roles-0</label>
<table id="group_roles-0">
<tr>
<th><label for="gr
oup_roles-0-group">Group</label></th>
<td><input checked id="group_roles-0-group" name="group_roles-0-group" type="checkbox" value="y"><
/td>
</tr>
<tr>
<th><label for="group_roles-0-role">Role</label></th>
<td>
<select id="group_roles-0-role" name="group_roles-0-role">
<option
selected value="none">----------</option>
<option value="approver">Approver</option>
<option value="editor">Editor</option>
</select>
</td
>
</tr>
</table>
</li>
<li>
<label for="group_roles-1">Group Roles-1</label>
<table id="group_roles-1">
<tr>
<th><label for="group_roles-1-gro
up">Group</label></th>
<td><input checked id="group_roles-1-group" name="group_roles-1-group" type="checkbox" value="y"></td>
</tr>
<tr>
<t
h>
<label for="group_roles-1-role">Role</label></th>
<td>
<select id="group_roles-1-role" name="group_roles-1-role">
<option selected value
="none">----------</option>
<option value="approver">Approver</option>
<option value="editor">Editor</option>
</select>
</td>
</tr>
</table>
<
/li>
</ul>
...发布于 2013-10-23 22:30:27
我不熟悉这些包,但我会尝试一下:
class AdminEditUserForm(Form, FullNameMixIn):
def __init__(self, groups):
super(AdminEditUserForm, self).__init__()
self.group_roles = FieldList(FormField(GroupRoleForm))
for group in groups:
self.group.label = group.name
self.group.name = group.id
self.group_roles.append_entry(self.group)
# If this doesn't create a copy of the GroupRoleForm
# superclass in group_roles, then you need a method to do it
self.__clear_group()
def __clear_group(self):
# copy GroupRoleForm object, if needed
# delete GroupRoleForm object
...然后你可以这样叫它:
form = forms.AdminEditUserForm(company.groups)https://stackoverflow.com/questions/12040688
复制相似问题