【问题标题】:web2py: How to make a SQLFORM.grid() of a requested table?web2py:如何制作一个请求表的 SQLFORM.grid()?
【发布时间】:2015-08-29 23:20:32
【问题描述】:

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

我做错了什么?

【问题讨论】:

    标签: web2py


    【解决方案1】:

    网格使用 URL 参数(控制器和函数名称之后的 URL 路径中的所有内容)来路由到其内置功能(例如,查看/创建/更新记录)。因此,如果您想在基本 URL 中包含一些将被网格忽略的 URL 参数,则必须通过其 args 参数指定这些参数:

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

    上面告诉网格忽略 URL 中的第一个参数(并在生成自己的内部 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'}}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2013-05-11
      相关资源
      最近更新 更多