Djando多级“选择”字段

2024-10-02 18:21:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立多层次的'选择'这是基于2个模型。你知道吗

第一个模型“组” 第二个模型“类别”

我想看到这样的“选择”:

<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

我使用下一个代码构建变量“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

如果我手动创建带有下一个值的“select”变量,它就会工作:

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

Tags: 模型valuecarsselectmercedesoptiongermanaudi
1条回答
网友
1楼 · 发布于 2024-10-02 18:21:48

看看由您的代码生成的列表和手工提供的列表,有一些区别。你知道吗

这是由您的代码生成的,在每个顶级元素后分成新行:

[
    '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个顶级元素,但您的代码正在生成包含6个元素的列表。在顶层应该只有2个元组元素,其中元组的第一个元素是group的label,第二个元素包含子元素的列表。子元素的列表也应该只包含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()]

相关问题 更多 >