Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改response.menu中的活动菜单项_Python_Web2py - Fatal编程技术网

Python 更改response.menu中的活动菜单项

Python 更改response.menu中的活动菜单项,python,web2py,Python,Web2py,我可以通过重新定义完整的菜单结构来更改活动菜单项 在每个函数调用中,例如: # default.py def Item1(): response.menu=[['Item1',True,URL('Item1')], ['Item2',False,URL('Item2')]] ... return locals() def Item2(): response.menu=[['Item1',False,URL('Item1')],

我可以通过重新定义完整的菜单结构来更改活动菜单项 在每个函数调用中,例如:

# 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(项目1)
要执行此操作吗

我可以在一个参数
active\u url
上找到一条注释,但我不知道如何使用它,找不到语法描述

编辑:

我可能还没有完全理解安东尼的答案,因为我无法运行它。因此,我现在以一种非常暴力的方式修改了代码,以

# 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()

我确信有一种更优雅的方法可以做到这一点,但我不知道。

如果您使用的是
菜单
帮助程序,当您调用它时,您可以将当前URL指定为活动URL:

MENU(response.menu, active_url=URL())
注意,
URL()
不带任何参数将返回包含当前请求的应用程序、控制器和函数的URL部分
URL(args=request.args)
还包括当前的
request.args
,最后,
URL(args=request.args,vars=request.get\u vars)
还包括当前请求的查询字符串。如果菜单项url包括
args
vars
,则您也需要将它们作为
活动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。从调用
菜单项
中的
URL()
中获取\u vars

对不起,您的答案可能高于我的薪资等级。也许我在编辑中所展示的暴力解决方法可以帮助你更好地理解我的目标。是的,上面提到了你的目标,但是,如果不知道您从上面尝试了什么以及得到了什么出乎意料的结果,就很难知道还能说些什么。我正在寻找一个预先存在的命令,例如
response.menu.activate(item1)
,它允许我按项目名称激活项目。我希望避免使用硬编码的索引号,因为我必须查找这些索引号,并且这些索引号可能会发生变化。显然,我可以编写自己的函数。可能没有。不,您要查找的内容不存在,除非您正在使用
菜单
帮助程序,如上面答案的前两行所述。我建议您使用上面所示的方法,而不是“暴力”方法,如果您更改菜单,这种方法将非常容易出错。