我们有以下表格,我们正在尝试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))
Run Code Online (Sandbox Code Playgroud)
我们如何创建一个AdminEditUserForm包含预先填充的列表的实例GroupRoleForms?
目前我们正试图这样做:
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 )
Run Code Online (Sandbox Code Playgroud)
在您data或您的formdata关键字参数中,Form您只需要一个与包含可迭代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()
Run Code Online (Sandbox Code Playgroud)
<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>
...
Run Code Online (Sandbox Code Playgroud)
小智 1
我不熟悉这些软件包,但我会尝试一下:
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
...
Run Code Online (Sandbox Code Playgroud)
那么你可以这样称呼它:
form = forms.AdminEditUserForm(company.groups)
Run Code Online (Sandbox Code Playgroud)