我想形成用户请求表的SQLFORM.grid()。基本上这样用户可以更改他们想要查看的表。这是我到目前为止所提出的:
行动。它会将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)
观点。它显示了一个请求的表,如果有请求的话:
{{extend 'layout.html'}}
{{if grid == None:}}
No table selected
{{else:}}
{{=grid}}
{{pass}}
现在,如果没有请求任何内容,这确实有效,但如果我输入地址栏,比如/sheet/auth_user
或其他任何内容,它会向我显示一条“未授权”的flash消息,并将一个奇怪的签名写入地址栏:/sheet?_signature=69abba0414d5920e970d8c9b17f5cbb60a5bbecc
。
唯一能打破这个问题的是请求。如果我将代码删除到基础并在代码中手动更改我想要的表,它就可以正常工作。所以这有效:
def sheet():
grid = None
dbTables = db.tables
table = "auth_user"
grid = SQLFORM.grid(db[table])
return dict(grid=grid, dbTables=dbTables)
我做错了什么?
答案 0 :(得分:0)
网格使用URL args(控制器和函数名后面的URL路径中的所有内容)路由到其内置功能(例如,查看/创建/更新记录)。因此,如果要在基本URL中包含一些URL网格中的URL args,则必须通过其args
参数指定这些args:
grid = SQLFORM.grid(db[table], args=[table])
上面告诉网格忽略URL中的第一个arg(并在生成自己的内部URL时保留它)。
如果您未能如上所述指定args
,则不仅内置功能会失败,而且当user_signature=True
(这是默认设置)时,访问将被拒绝,因为基本URL该函数与请求的URL(包括未知的URL arg)不匹配。这就是您收到“未授权”消息的原因。如果禁用user_signature
(不推荐),您将不会收到“未授权”消息,但没有任何内部网格链接可以正常工作(因为第一个URL arg将被删除,从而消除了对正确的表格。)
另请注意,您的功能可以简化:
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'}}