2017-02-22 26 views
0

我在使用python/ndb從GAE中的密鑰刪除實體時遇到問題。我能夠從頁面檢索實體(問題)鍵,但無法弄清楚如何讓它刪除。 GAE支持頁面表示,它像檢索密鑰然後刪除它一樣簡單,如下所示。GAE - 從密鑰中刪除實體時出錯

problem = problem_key.get() 
problem.key.delete() 

但這不起作用。我很確定關鍵是正確獲得。該HTML看起來像

{%for problem in problems %} 
    <tr> 
     <td>{{ problem.tags }}</td> 
     <td><script type="math/tex">{{ problem.content }}</script></td> 
     <td>{{ problem.answer }}</td> 
     <td>{{ problem.quiz }}</td> 
     <td>{{ problem.id }}</td> 
     <td>{{ problem.date }}</td> 
     <form action="/deleteProblem" method="POST"> 
      <td><button type="submit" name="problem_key" value="{{ problem.key }}">Delete Problem</button></td> 
     </form> 
    </tr> 
{% endfor %}  

而且我的Python代碼如下所示:

class deleteHandler(BaseHandler): 
    def post(self): 
     prob_key = self.request.get('problem_key') 
     problem = prob_key.get() 
     problem.key.delete() 
     self.redirect("/") 

我越來越:

problem = prob_key.get()  
AttributeError: 'unicode' object has no attribute 'get' 

我最好的猜測是,prob_key是越來越分配的實際Unicode和所以當然沒有get()的方法,但我不明白如何解決這個問題的基礎上谷歌的解釋應該如何運作。

編輯:好的,跑遍了一段時間了,我已經改變了這一行:

prob_key = self.request.get('problem_key') 

prob_key = ndb.Key('Problem', int(self.request.get('problem_id') 

因爲據我瞭解,一鍵可以構造以下面的方式

ndb.Key('kind', 'id') 

不幸的是,我仍然無法得到它的工作。現在我越來越

problem.key.delete() 
AttributeError: NoneType has no attribute 'key' 
+0

您尚未傳遞實際的Key對象。從傳遞的字符串中創建一個Key對象,然後執行刪除操作。 –

+0

一旦你有一個關鍵對象,你不需要得到實際的模型實例;只需直接在密鑰上調用delete即可。 –

+0

@AvinashRaj我試圖得到它,不能讓它工作。我添加了我嘗試編輯的內容 – quest2graduate18

回答

0

您無法通過HTML頁面傳遞的主要對象本身,但是你可以通過它的.urlsafe()字符串表示。

所以在你的HTML顯示的字符串表示,像這樣的:

prob_key = ndb.Key(urlsafe=self.request.get('problem_key')) 

Retrieving Entities from Keys

You can also use an entity's key to obtain an encoded string suitable for embedding in a URL:

url_string = sandy_key.urlsafe() 

This produces a result like agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM which can later be used to reconstruct the key and retrieve the original entity:

sandy_key = ndb.Key(urlsafe=url_string) 
sandy = sandy_key.get() 

value="{{ problem.key.urlsafe() }}" 

而在你的處理程序代碼從字符串表示恢復密鑰

+0

我現在得到一個模板語法錯誤。我不知道這與它有什麼關係,但我正在使用webapp2。編輯我的問題的管理員用Django標記了它。 – quest2graduate18

+0

可能是因爲試圖在模板本身中調用'urlsafe()',我只是假設它會像這樣工作,基於http://stackoverflow.com/questions/5190204/is-it-possible-to-access -THE琴鍵名稱的-的對象從 - 內-A-Jinja2的模板。也可以嘗試'problem.key.urlsafe'(如果這確實是一個django模板)。就我個人而言,我不會在模板中調用對象方法,我在處理程序代碼中這樣做,可以在將結果傳遞給模板之前對結果進行清理。你可以做同樣的事情,例如在'problem'類中增加一個@屬性,返回'self.key.urlsafe()'。 –

+0

工作!非常感謝你 – quest2graduate18