我尝试构建基于2个模型的多级“选择”。
第一个模特'团体' 第二个模型'类别'
我希望看到'select'这样:
Missing requirement: EMF Builder Generator (Core/UI) 0.0.5.v201204241907 (de.qyotta.emfbuildergen.feature.feature.group 0.0.5.v201204241907) requires 'org.eclipse.uml2.codegen.ecore [1.5.0,2.0.0)' but it could not be found
<select>
<optgroup label="Swedish Cars">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
</optgroup>
<optgroup label="German Cars">
<option value="mercedes">Mercedes</option>
<option value="audi">Audi</option>
</optgroup>
</select>
我使用下一个代码构建变量'select':
self.fields["category"].choices = select
但'select'变量中的值不适用于下一个代码:
group=Group.objects.all()
for i in group:
if len(select)<=0:
select=[(i.name)]
else:
select.append(i.name)
for n in Category.objects.filter(maingroup_id=i.id):
select.append((str(n.id), n.name),)
print(select)
'Swedish Cars', ('volvo', 'Volvo'), ('saab', 'Saab'), 'German Cars',('mercedes', 'Mercedes'), ('audi', 'Audi')
如果我手动创建带有下一个值的'select'变量,它会起作用:
self.fields["category"].choices = select
答案 0 :(得分:0)
请查看您手动提供的代码和列表生成的列表,但存在一些差异。
这是由您的代码生成的,在每个顶级元素之后分成新行:
LinkedList list = new LinkedList();
list.add(2);
list.add(1);
list.add(3);
int maxInd = 0;
int list_size = list.size();
for (int i = 0; i < list_size; i++) {
if((list.get(i)) > (list.get(MaxInd))) {
maxInd = i;
} // end if condition
} // end for loop
这是由您手工提供的:
[
'Swedish Cars',
('volvo', 'Volvo'),
('saab', 'Saab'),
'German Cars',
('mercedes', 'Mercedes'),
('audi', 'Audi'),
]
如您所见,正确列表仅包含2个顶级元素,但您的代码生成包含六个元素的列表。在顶层,应该只有2元组元素,其中该元组的第一个元素是组的标签,第二个元素包含子元素列表。子元素列表也应该只包含2元组元素,其中元组的第一个元素应该是您选择的值,第二个是该值的标签。
更正后的代码:
[
('Swedish Cars', (('volvo', ' Volvo'), ('saab', 'Saab'))),
('German Cars', (('mercedes', 'Mercedes'), ('audi', 'Audi'))),
]
或更多pythonic版本:
group=Group.objects.all()
select = []
for i in group:
subgroup = []
for n in Category.objects.filter(maingroup_id=i.id):
subgroup.append((str(n.id), n.name))
select.append(group.name, subgroup)