2013-03-07 67 views
1

我希望我的用户能够通过单击每个对象旁边的按钮来修改显示的数据存储对象的属性。如何从index.html中的模板返回appengine数据存储对象的密钥?

为了做到这一点,我相信我需要从index.html的获得数据存储对象的ID后面,当用户点击该按钮:

从index.html的:

{% for polyhedron in polyhedrons %} 
    {{ polyhedron.name }} 
    {{ polyhedron.color }} 
    <form action="/correction" method=post> 
     <input type=submit id="{{ polyhedron.key }}" name=content value="red"> 
     <input type=submit id="{{ polyhedron.key }}" name=content value="green"> 
    </form> 

处理程序:

class CorrectionHandler(webapp2.RequestHandler): 
    def post(self): 
     polyhedron_object = self.request.get("id") 
     polyhedron_object.color = self.request.get('content') 

然而,self.request.get( “ID”)返回什么都没有。

回答

2

我会用一个隐藏的输入对象的ID标识。我不确定您是否使用db.Modelndb.Model。如果你正在使用db.Model为对象,我会做:

{% for polyhedron in polyhedrons %} 
{{ polyhedron.name }} 
{{ polyhedron.color }} 
<form action="/correction" method=post> 
    <input type="hidden" name="key" value="{{ polyhedron.key().id() }}"> 
    <input type="submit" id="{{ polyhedron.key().id() }}" name="color" value="red"> 
    <input type="submit" id="{{ polyhedron.key().id() }}" name="color" value="green"> 
</form> 

如果使用ndb.Model,我会做

{% for polyhedron in polyhedrons %} 
{{ polyhedron.name }} 
{{ polyhedron.color }} 
<form action="/correction" method=post> 
    <input type="hidden" name="key" value="{{ polyhedron.key.urlsafe() }}"> 
    <input type="submit" id="{{ polyhedron.key.urlsafe() }}" name="color" value="red"> 
    <input type="submit" id="{{ polyhedron.key.urlsafe() }}" name="color" value="green"> 
</form> 

你的处理程序,如果你正在使用db.Model是:

class CorrectionHandler(webapp2.RequestHandler): 
    def post(self): 
     polyhedron_object_key = self.request.get("key") 
     polyhedron_object = Polyhedron.get_by_id(polyhedron_object_key) 
     polyhedron_object.color = self.request.get('color') 

你的处理程序,如果你正在使用ndb.Model是:

class CorrectionHandler(webapp2.RequestHandler): 
    def post(self): 
     polyhedron_object_key = self.request.get("key") 
     polyhedron_object = ndb.Key(urlsafe=polyhedron_object_key).get() 
     polyhedron_object.color = self.request.get('color') 
+0

谢谢!我使用db。我认为,你的答案非常接近解决方案,但是get_by_id()出现错误:“BadArgumentError:期望一个实例或迭代(,);收到165(一个unicode)。”如果我将id转换为int或long,我会得到一个'None'对象。换句话说,我不知道如何确保id在返回时有正确的类型。 – memius 2013-03-08 14:45:17

+0

投射到整数不应返回无。您是否正在执行以下操作:polyhedron_object = Polyhedron.get_by_id(int(polyhedron_object_key)) – 2013-03-08 16:07:43

+0

使用'polyhedron.key.id'更改'polyhedron.key().id()'并且上面的代码可以工作。请注意,在Django模板变量中不允许使用括号。 – 2013-03-08 16:09:29

1

我认为polyhedron.key包含像Key('Polyhedron',1)之类的东西。再次

{% for polyhedron in polyhedrons %} 
    {{ polyhedron.name }} 
    {{ polyhedron.color }} 
    <form action="/correction" method=post> 
     <input type=submit id="{{ polyhedron.key.id() }}" name=content value="red"> 
     <input type=submit id="{{ polyhedron.key.id() }}" name=content value="green"> 
    </form> 

然后在你的处理器构建的关键:要获得唯一对象ID试试这个

class CorrectionHandler(webapp2.RequestHandler): 
    def post(self): 
     polyhedron_object = self.request.get("id") 
     polyhedron__key = ndb.Key('Polyhedron', self.request.get('id')) 
     polyhedron_object.color = self.request.get('content') 

哪里多面体是型号名称。

1

您正在混淆您的HTML属性。当您这样做时:

self.request.get("foo") 

它返回具有“foo”作为“名称”的HTML元素的值。所以,你的HTML改成这样:

<form action="/correction" method=post> 
    <input type=submit name="{{ polyhedron.key.id }}" value="red"> 
    <input type=submit name="{{ polyhedron.key.id }}" value="green"> 
</form> 

然后

self.request.get("123") 

将返回颜色就是123

0

这应该是非常简单的,如果您使用db.model

首先,您不要求使用输入标记的id值,而是使用名称。其次,就像亚伦提到的一样,你的用户不需要看到那个关键字。掩盖它

所以你的HTML应该是这样的

{% for polyhedron in polyhedrons %} 
    {{ polyhedron.name }} 
    {{ polyhedron.color }} 
    <form action="/correction" method=post> 
     <input type="hidden" name="key" value="{{polyhedron.key()}}"> 
     <input type="submit" id="{{ polyhedron.key().id() }}" name="color" value="red"> 
     <input type="submit" id="{{ polyhedron.key().id() }}" name="color" value="green"> 
    </form> 

最后处理程序应该是这样的

class CorrectionHandler(webapp2.RequestHandler): 
    def post(self): 
     color = self.request.get("color") 
     polyhedron_key = self.request.get("key") 
     polyhedron_object = db.get(polyhedron_key) 

     if color == "red": 
      polyhedron_object.color = "red" 
     else: 
      polyhedron_object.color = "green" 
     polyhedron_object.put() 

正如你可以看到我使用了一些Python代码在那里,但你可以如果您使用Java,请遵循相同的逻辑。我希望它有帮助