2013-06-11 58 views
0

我试图创建Google App Engine的数据存储和db模型的基本用法。我的模型对象是Google App Engine数据存储模型属性返回无

class Table(db.Model): 
    row = db.IntegerProperty() 
    col = db.IntegerProperty() 
    date = db.DateTimeProperty(auto_now_add=True) 

它将用于保存行和列的表。用户通过html提供输入,然后保存表格并在数据存储区中绘制所有表格。我使用Table.all()从数据存储中获取所有表格,然后尝试访问其内容,以便打印表格,但由于某种原因,当在for y in range(row):中读取table.row和table.col时,显然会返回一个noneType,有人知道为什么?

import webapp2 
from google.appengine.ext.webapp.util import run_wsgi_app 
from google.appengine.ext import db 
from logging import error 

INITIAL_INPUT = """\ 
<html> 
    <body> 
     <form action="/out?%s" method="POST"> 
      <input type="text" name="row" /> 
      <input type="text" name="col" /> 
      <input type="submit" value="Submit" /> 
     </form> 
    </body> 
</html> 
""" 

class Table(db.Model): 
    """Models an individual Guestbook entry with author, content, and date.""" 
    row = db.IntegerProperty() 
    col = db.IntegerProperty() 
    date = db.DateTimeProperty(auto_now_add=True) 

class MainPage(webapp2.RequestHandler): 
    def get(self): 
     self.response.write(INITIAL_INPUT) 

class Out(webapp2.RequestHandler): 

    def post(self): 
     newRow = self.request.POST['row'] 
     newCol = self.request.POST['col'] 
     newTable = Table() 
     newTable.row = int(newRow) if newRow else 1 
     newTable.col = int(newCol) if newCol else 1 
     newTable.put() 
     tables = Table.all() 
     for table in tables: 
      self.drawTable(table.row, table.col) 


    def drawTable(self, row , col): 
     write = self.response.write 
     write("<html><body><table>") 
     for y in range(row): 
      write("<tr>") 
      for x in range(col): 
       cell = "<td bgcolor=\"#00FF00\">" + str(x) + " " + str(y) + "</td>" 
       if x % 2 == 0: 
        cell = "<td bgcolor=\"#FF0000\">" + str(x) + " " + str(y) + "</td>" 
       write(cell) 
      write("</tr>")  
     write("</table></body></html>") 

application = webapp2.WSGIApplication([ 
    ('/', MainPage), 
    ('/out', Out)] 
, debug=True) 

def main(*args, **kwds): 
    run_wsgi_app(application) 


if __name__ == "__main__": 
    main() 
+1

检查表中现有的实体。听起来你至少有一个(可能是之前创建的)没有'row'值。您可能需要在行和列属性上设置'required = True'。 –

+0

我该怎么做才是db.IntegerProperty(required = True)? – EasilyBaffled

+0

是的,没错。 –

回答

1

注:<form action="/out?%s"不正确,它仅需要action="/out"

我敢打赌,你在Table有其他实体,所以你的循环接他们。使用数据存储查看器查看By kind: Table并删除具有空行col值的列。

也许你只想绘制张贴的表格?更改这些行:

tables = Table.all() 
    for table in tables: 
     self.drawTable(table.row, table.col) 

到:

self.drawTable(newTable.row, newTable.col) 
+0

为什么'/ out?%s'错了?老实说,我从一个例子中复制了它,并没有专注于它。另外,我确实想要打印所有的表格。最后,我如何访问数据存储查看器? – EasilyBaffled

+1

通常,使用%运算符时,字符串中的“%s”是另一个字符串的占位符。如果你想进行自定义操作,那么这是正确的。由于您的应用程序使用'/ out'和POST方法,因此忽略(?%s)(幸运的是)。 –

+1

要访问数据存储查看器,请转到https://appengine.google.com/并选择您的应用程序。当您看到仪表板时,单击左侧菜单栏上的数据存储查看器链接。 –

相关问题