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

时间:2017-02-27 22:08:03

标签: python web2py

尝试在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>

2 个答案:

答案 0 :(得分:2)

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

可能你想改变

post = db.products(2)  

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

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

答案 1 :(得分:0)

index.js返回db.products(2)表中db.products为2的记录。如果尚未创建此类记录(这似乎是您的情况),那么它将返回id。在视图中,当您有None时,相当于post.Product_Name,这会引发您看到的None.Product_name错误。

您可能希望在NoneType控制器函数或其关联视图中使用某些逻辑来处理所请求的产品show()不存在的情况(重定向或在视图中显示特殊消息)

此外,正如this answer中所述,因为“索引”页面上的链接包含id等网址(URL('show', args=row.id)记录ID作为第一个网址arg),您应该通过以下方式检索db.products控制器中的请求记录:

show