Доступ к данным из OrderedDict в Python и цикл по ним - PullRequest
3 голосов
/ 20 мая 2019

У меня есть OrderedDict в моем приложении Django, которое позволяет получать content edition и content subversions для каждого издания.

Это выглядит так:

from collections import OrderedDict
od = OrderedDict()

for version in list_of_edition():
    od.setdefault((version.pk, version.title), []).extend([(subversion.pk, subversion.title) for subversion in version.collection.all()])

Я получаю:

OrderedDict([((2, '10th Edition (Current)'), [(58464, 'Ph. Eur. 10.0 lite')]), ((1, '9th Edition'), [(21928, 'Ph. Eur. 9.8 lite'), (29235, 'Ph. Eur. 9.9 lite'), (36542, 'Ph. Eur. 9.10 lite')])])

# Rewritten in order to get more readable
OrderedDict(
    [
        (
            (2, '10th Edition (Current)', True), [(58464, 'Ph. Eur. 10.0 lite')]
        ),
        (
            (1, '9th Edition', True), [(21928, 'Ph. Eur. 9.8 lite'), (29235, 'Ph. Eur. 9.9 lite'), (36542, 'Ph. Eur. 9.10 lite')]
        )
    ]
)

Этот OrderedDict позволяет мне создавать вкладки для навигации в меню панели навигации. Должно быть:

Tab : 10th Edition (Current) 
    |
    ---> subtab : Ph. Eur. 10.0 lite

Tab : 9th Edition
    |
    ---> subtab : Ph. Eur. 9.8 lite
    |
    ---> subtab : Ph. Eur. 9.9 lite
    |
    ---> subtab : Ph. Eur. 9.10 lite

В моем файле menu.py меню создается следующим образом:

content_children = (
    AdminMenuItem(_('Manage smth1'), reverse('smth1-list'), weight=100, separator=False),
    AdminMenuItem(_('Manage smth2'), reverse('smth2-list'), weight=100, separator=False),
    ...
)

Menu.add_item('content', MenuItem(_('Content'), '#content', children=content_children)

Так что я пытаюсь перебрать OrderedDict, чтобы создать свое меню, как в предыдущем примере. У меня возникают трудности с выделением каждого меню и добавлением подменю для каждого связанного меню:

edition_children = ()
for version in od:
    for element in od[version]:
        edition_children += MenuItem(element[1], reverse('home'), weight=150, separator=False),

for version in od:
    Menu.add_item('edition', MenuItem(version[1], '#', children=edition_children))

Это дает мне:

enter image description here

Это то же самое для 9th Edition. Для 10th Edition у меня должно быть только Ph. Eur. 10.x, а для 9th Edition у меня должно быть только Ph. Eur. 9.x

Большое спасибо заранее

1 Ответ

2 голосов
/ 20 мая 2019

Вы создаете список всех подверсий и затем добавляете этот список во все выпуски.

Перестройте ваш цикл так:

for version in od:
    edition_children = ()
    for element in od[version]:
        edition_children += MenuItem(element[1], reverse('home'), weight=150, separator=False),
    Menu.add_item('edition', MenuItem(version[1], '#', children=edition_children))
...