2017-02-22 19 views
0

У меня возникли проблемы с удалением сущностей из ключей в GAE с использованием python/ndb. Я могу получить ключ сущности (проблемы) со страницы, но не могу понять, как его удалить. На странице поддержки 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 %}  

И мой питон код выглядит следующим образом:

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 становится назначен фактический юникода и поэтому, конечно, нет метода get(), но я не понимаю, как исправить проблему на основе объяснения Google того, как она должна функционировать.

EDIT: Хорошо, был скаутинг вокруг некоторое время, и я изменил эту строку:

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 отображения строковое представление, как это:

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

И в коде обработчика восстановления ключа из его строкового представления:

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() 
+0

Теперь я получаю синтаксическую ошибку шаблона. Я не знаю, связано ли это с этим, но я использую webapp2. Администратор, который редактировал мой вопрос, отметил его с помощью Django. – quest2graduate18

+0

Возможно, из-за попытки вызвать 'urlsafe()' в самом шаблоне, я просто предположил, что он будет работать следующим образом: на основе http://stackoverflow.com/questions/5190204/is-it-possible-to-access -The-ключ-имя-ан-объекта-из-внутри-а-jinja2-шаблона. Попробуйте 'problem.key.urlsafe' (в случае, если это действительно шаблон django). Лично я не вызываю методы объекта в шаблоне, я делаю это в коде обработчика, где я могу дезинфицировать результат, прежде чем передавать его в шаблон. Вы можете сделать то же самое, скажем, добавив '@ property' в класс' problem', возвращая 'self.key.urlsafe()'. –

+0

Это сработало! большое спасибо – quest2graduate18

Смежные вопросы