需要获取实体密钥才能删除实体

时间:2016-01-16 23:32:35

标签: google-app-engine entity google-cloud-datastore

我正在尝试使用html中的链接从数据存储中删除实体。我知道为了做到这一点,我需要拥有实体的密钥,以便我知道哪个实体可以将删除链接“配对”,可以这么说。我不能为我的生活弄清楚如何做到这一点......

这是我的html文件,显示了数据库中的所有汽车:

{% if cars|length > 0 %}
        {% for c in cars %}
            <tr>
                <td>{{ c.make }}</td>
                <td>{{ c.model }}</td>
                <td>{{ c.year }}</td>
                <td>
                    {% for i in c.color %}
                        {{ i }}
                    {% endfor %}
                </td>
                <td>{{ c.condition }}</td>
                <td>{{ c.date }}</td>
                <td>
                    <a href="/view_cars/{{ c.key().id() }}">Delete Car</a>
                </td>
            </tr>
            {% endfor %}
        {% endif %}

这是python文件:

class AddCarHandler(webapp2.RequestHandler):
    template_variables = {}

    def get(self):
        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(self.template_variables))

        action = self.request.get('action')

        #if the user adds a car
        if action == 'add_car':
            c = car_database.Car()

            c.make = self.request.get('car-make')
            c.model = self.request.get('car-model')
            c.year = self.request.get('car-year')
            c.color = self.request.get_all('car-color')
            c.condition = self.request.get('car-condition')
            c.date = self.request.get('car-date')

            car_key = c.put()

class ViewCarHandler(webapp2.RequestHandler):
    template_variables = {}

    def get(self):
        car = car_database.Car()
        #ndb query
        self.template_variables['cars'] = [{'make':x.make, 'model':x.model, 'year':x.year, 'color':x.color, 'condition':x.condition, 'date':x.date} for x in    car_database.Car.query().fetch()]
        template = JINJA_ENVIRONMENT.get_template('/view_cars.html')
        self.response.write(template.render(self.template_variables))

1 个答案:

答案 0 :(得分:0)

您可以获取实体的密钥(例如,通过查询获取),如下所示:

entity_key = entity.key

注意:这仅在 实体保存到数据库之后才有效,而不是之前(即entity.put()至少被调用一次)。

要在the documentation之间传递python代码和URL或HTML代码之间的密钥,您可以使用密钥的网址字符串或基于该字符串的预先计算的删除网址,传递给例如,self.template_variables['cars']

  

您还可以使用实体键来获取合适的编码字符串   用于嵌入URL:

url_string = sandy_key.urlsafe()
     

这会产生像agVoZWxsb3IPCxIHQWNjb3VudBiZiwIM这样的结果   稍后用于重建密钥并检索原始实体:

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

您需要为此类删除网址添加处理程序,您可以在其中重建上面引用的密钥,然后调用:

entity_key.delete()