web2py:如何创建所请求表的SQLFORM.grid()?

时间:2015-08-29 23:20:32

标签: web2py

我想形成用户请求表的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)

我做错了什么?

1 个答案:

答案 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'}}