Изменение активного пункта меню в response.menu - PullRequest
0 голосов
/ 09 января 2019

Я могу изменить активный пункт меню, переопределив всю структуру меню в каждом вызове функции, например:

# default.py
def Item1():
    response.menu=[['Item1',True,URL('Item1')],
                  ['Item2',False,URL('Item2')]]
    ...
    return locals()

def Item2():
    response.menu=[['Item1',False,URL('Item1')],
                  ['Item2',True,URL('Item2')]]
    ...
    return locals()

Есть ли более компактный способ, такой как response.menu.activate(item1) чтобы сделать это?

Я могу найти замечание по аргументу active_url здесь , но я не понимаю, как его использовать, не могу найти описание синтаксиса.

EDIT:

Возможно, я не полностью понял ответ Энтони, так как не могу его запустить. Поэтому теперь я очень грубо изменил код до

# menu.py
response.menu=[['Item1',False,URL('Item1')],
               ['Item2',False,URL('Item2')]]


# default.py
def Item1():
    response.menu[0][1]=True
    ...
    return locals()

def Item2():
    response.menu[1][1]=True
    ...
    return locals()

Я почти уверен, что есть более элегантный способ сделать это, о котором я не знаю.

1 Ответ

0 голосов
/ 10 января 2019

Если вы используете помощник MENU, при его вызове вы можете указать текущий URL как активный:

MENU(response.menu, active_url=URL())

Примечание. URL() без аргументов возвращает часть URL-адреса, содержащую приложение, контроллер и функцию для текущего запроса. URL(args=request.args) также включает текущую request.args, и, наконец, URL(args=request.args, vars=request.get_vars) дополнительно включает строку запроса текущего запроса. Если URL вашего пункта меню включают args или vars, то вам также нужно будет передать их как active_url, иначе совпадения не будет.

В качестве альтернативы, для каждого пункта меню вы можете сделать что-то вроде:

current_url = URL(args=request.args, vars=request.vars)
response.menu = [
    ['Item1', URL('item1') == current_url, URL('item1')],
    ['Item2', URL('item2', args='arg1') == current_url, URL('item2', args1='arg1')],
    ...
]

Чтобы избежать избыточности, вы можете использовать помощника, например:

def menu_item(label, *args, **kwargs):
    url = URL(*args, **kwargs)
    return [label, url == URL(args=request.args, vars=request.get_vars), url]

response.menu = [
    menu_item('Item1', 'item1'),
    menu_item('Item2', 'item2', args='args1'),
    menu_item('Item3', 'item3', args='args1', vars=dict(var1=1))
]

Если вы не хотите сопоставлять строку запроса, чтобы определить активный URL, исключите vars=request.get_vars из вызова на URL() в menu_item.

...