индекс списка трясогузки django вне допустимого диапазона

Не могли бы вы помочь мне с этой проблемой. Я пытаюсь добавить показывать только переведенный заголовок меню. И добавив этот код в мой файл тегов:

@register.inclusion_tag('home/tags/top_menu.html', takes_context=True)
def top_menu(context, parent, calling_page=None):
    request = context['request']
    language_code = request.LANGUAGE_CODE
    menuitems = parent.get_children().live().in_menu().filter(title = language_code)[0].get_children()
    for menuitem in menuitems:
        menuitem.show_dropdown = has_menu_children(menuitem)
        menuitem.active = (calling_page.path.startswith(menuitem.path)
                           if calling_page else False)
    return {
        'calling_page': calling_page,
        'menuitems': menuitems,
        'request': context['request'],
    }

Но я получаю эту ошибку на странице: индекс списка вне диапазона и выделенный код

{% top_menu parent=site_root call_page=self %}

Использование трясогузки 1.12 и Python 3.6.2


person Kaijun    schedule 21.09.2017    source источник


Ответы (1)


parent.get_children().live().in_menu().filter(title = language_code)[0]

Вы не учитываете возможность того, что .filter(title = language_code) вернет пустой список.

Вы должны либо использовать try-except, либо разделить эту часть кода на несколько строк, а затем проверить, не вернул ли .filter пустой список.

Например:

@register.inclusion_tag('home/tags/top_menu.html', takes_context=True)
def top_menu(context, parent, calling_page=None):
    request = context['request']
    language_code = request.LANGUAGE_CODE 
    try:
        menuitems = parent.get_children().live().in_menu().filter(title = language_code)[0].get_children()
    except IndexError:
        menuitems = []
    else:  # you don't actually need to have 'else' in this case
        for menuitem in menuitems:
            menuitem.show_dropdown = has_menu_children(menuitem)
            menuitem.active = (calling_page.path.startswith(menuitem.path)
                               if calling_page else False)
    return {
        'calling_page': calling_page,
        'menuitems': menuitems,
        'request': context['request'],
    }
person DeepSpace    schedule 21.09.2017