Python 发布数据库行时出现 NoneType 错误

Python NoneType error when posting a database row

尝试在 Web2Py 上创建页面时出现 NoneType 属性错误。我正在尝试加载 'show' 页面,但我的 Product_Name 属性出现 NoneType 错误。

这是我创建的数据库:

db.define_table('products',
            Field('Product_Name',requires=IS_NOT_EMPTY()),
            Field('Product_Description',requires=IS_NOT_EMPTY()),
            Field('Product_Review',requires=IS_NOT_EMPTY()))

这是我的控制器:

    def index():
    form = SQLFORM(db.products).process()
    rows = db(db.products).select()
    return locals()

def show():
    post = db.products(2)
    return locals()

这是我要运行(显示)的页面:

    {{extend 'layout.html'}}

<h2>{{=post.Product_Name}}</h2>

<p>Hellooooo
    {{=post.Product_Description}}
    {{=post.Product_Review}}
</p>

这是与我的展示页面相关的页面:

{{extend 'layout.html'}}

当前产品

<table class="table">
    {{for row in rows:}}
    <tr>
        <td><a href="{{=URL('show',args=row.id)}}">{{=row.Product_Name}}</a></td>          
    </tr>
    {{pass}}
</table>

我很确定这是由于 post 是 None,然后视图尝试访问 post.Product_Description 和 post.Product_Review,然后你得到一个 AttributeError .

可能你想改变

post = db.products(2)  

post = db.products(request.args(0, cast=int))  

这将使它与您在索引中建立的链接保持一致。

db.products(2) returns 来自 db.products table 的记录,其 id 为 2。如果尚未创建此类记录(出现根据您的情况),那么它将改为 return None。在视图中,当您有 post.Product_Name 时,这相当于 None.Product_name,这会引发您看到的 NoneType 错误。

您可能需要在 show() 控制器函数或其关联视图中使用一些逻辑来处理请求的产品 id 不存在的情况(重定向或在查看)。

此外,如 中所述,因为 "index" 页面上的链接有 URL 类似 URL('show', args=row.id)(具有 db.products 记录 ID作为第一个 URL arg),您应该通过以下方式在 show 控制器中检索请求的记录:

post = db.products(request.args(0, cast=int))