Djando多级'选择'字段

时间:2015-08-31 12:50:58

标签: python django

我尝试构建基于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

1 个答案:

答案 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)