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'}}
我想形成一个 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'}}