2015-08-31 83 views
-1

我试图建立基于2个模型的多级“选择”。Djando多级“选择”字段

第一种模式 '集团' 第二种模式 '类别'

我希望看到 '选择' 是这样的:

<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>

self.fields["category"].choices = 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') 

但在价值“选择”变量不与下面的代码工作:

('Swedish Cars', (('volvo', ' Volvo'), ('saab', 'Saab'))),('German Cars', (('mercedes', 'Mercedes'), ('audi', 'Audi'))) 
+0

纠正你的代码片段,您的选择构建代码里面有什么不对的压痕,也在里面打印结果有缺失的撇号/引号。没有,我不知道如果你的代码是错误的,或者如果你只是没有正确地粘贴在这里 – GwynBleidD

+0

我纠正了撇号/报价 – Oleg

回答

0

采取:

self.fields["category"].choices = select 

如果我创建“选择”变量与手动未来价值的IT工作看看你的代码生成的列表,并列出你手动提供的列表,这里有一些区别。

这是由你的代码生成,每个顶级元素后分离到新的线路:

[ 
    'Swedish Cars', 
    ('volvo', 'Volvo'), 
    ('saab', 'Saab'), 
    'German Cars', 
    ('mercedes', 'Mercedes'), 
    ('audi', 'Audi'), 
] 

,这是由你的手提供:

[ 
    ('Swedish Cars', (('volvo', ' Volvo'), ('saab', 'Saab'))), 
    ('German Cars', (('mercedes', 'Mercedes'), ('audi', 'Audi'))), 
] 

正如你所看到的,正确的列表只包含2个顶级元素,但是您的代码正在生成包含六个元素的列表。在顶层,应该只有2元组元素,其中该元组的第一个元素是组的标签,第二个元素包含子元素列表。子元素列表也应该只包含2元组元素,其中元组的第一个元素应该是您选择的值,其次是该值的标签。

更正代码:

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) 

或更Python版本:

select = [(g.name, [(n.id, n.name) for n in Category.objects.filter(maingroup_id=group.id)]) for g in Group.objects.all()] 
+0

这是有效的。谢谢你的帮助。 – Oleg