web2py:如何制作请求的 table 的 SQLFORM.grid()?

web2py: How to make a SQLFORM.grid() of a requested table?

我想形成一个 SQLFORM.grid() 的用户请求 table。基本上这样用户就可以更改他们想要查看的 table。这是我到目前为止想出的:

动作。它将 grid 初始化为 None,除非有其他要求:

def sheet():
    grid = None
    dbTables = db.tables
    if request.args:
        table = request.args(0,cast=str)
        grid = SQLFORM.grid(db[table])
    return dict(grid=grid, dbTables=dbTables)

景色。它显示一个请求 table,如果一个被请求:

{{extend 'layout.html'}}
{{if grid == None:}}
No table selected
{{else:}}
{{=grid}}
{{pass}}

现在,如果没有任何请求,这确实有效,但是如果我在地址栏中输入 /sheet/auth_user 或其他任何内容,它会显示一条闪现消息,上面写着 "not authorized" 并写了一个奇怪的签名到地址栏:/sheet?_signature=69abba0414d5920e970d8c9b17f5cbb60a5bbecc.

唯一打破这一点的是请求。如果我将代码简化为基础并在代码中手动更改我想要的 table ,它就可以正常工作。所以这有效:

def sheet():
    grid = None
    dbTables = db.tables
    table = "auth_user"
    grid = SQLFORM.grid(db[table])
    return dict(grid=grid, dbTables=dbTables)

我做错了什么?

网格使用 URL 参数(控制器和函数名称后 URL 路径中的所有内容)路由到其内置功能(例如,到 view/create/update 记录).所以,如果你想在基础 URL 中包含一些要被网格忽略的 URL 参数,你必须通过它的 args 参数指定这些参数:

grid = SQLFORM.grid(db[table], args=[table])

上面告诉网格忽略 URL 中的第一个参数(并在生成自己的内部 URLs 时保留它)。

如果你没有像上面那样指定args,不仅内置功能会失败,而且当user_signature=True(这是默认值)时,访问也会被拒绝,因为基础函数的 URL 与请求的 URL 不匹配(其中包含未知的 URL arg)。这就是您收到 "not authorized" 消息的原因。如果禁用 user_signature(不推荐),您将不会收到 "not authorized" 消息,但内部网格链接的 none 会正常工作(因为第一个 URL arg会被删除,从而消除对正确 table).

的引用

另请注意,您的函数可以简化:

def sheet():
    table = request.args(0)
    grid = SQLFORM.grid(db[table], args=[table]) if table in db.tables else None
    return dict(grid=grid)

此外,在视图中,只需执行:

{{=grid or 'No table selected'}}