【问题标题】:There is a way to access ndb model class property from jinja2 template有一种方法可以从 jinja2 模板访问 ndb 模型类属性
【发布时间】:2012-06-14 16:08:49
【问题描述】:

我正在使用 Appengine 1.6.5,从我得到的 jinja2 模板访问 NDB 模型类属性,但我得到了正确的结果,在循环中访问相同的属性。 为了解释问题,我发布了一些代码

--- 型号---

class Vehicles(ndb.Model):
    registration = ndb.StringProperty()
    brand = ndb.StringProperty()
    model = ndb.StringProperty()
    cost = ndb.FloatProperty()
    km_cost = ndb.FloatProperty()
    viacard = ndb.StringProperty()
    telepass = ndb.StringProperty()

class Employees(ndb.Model):
    user_id = ndb.StringProperty()
    name = ndb.StringProperty()
    surname = ndb.StringProperty()
    email = ndb.StringProperty()
    job = ndb.StringProperty()
    credit_card = ndb.StringProperty()
    cc_expiry_date = ndb.StringProperty()
    vehicle = ndb.KeyProperty(kind=Vehicles)
    last_login = ndb.DateTimeProperty(auto_now=True)
    last_activity = ndb.DateTimeProperty(auto_now=True)

    @property
    def vehicle_registration(self):
        return Key(self.vehicle.kind(),int(self.vehicle.id())).get().registration

--- 处理程序 --- 这只是处理程序的一部分

class BaseHandler(webapp2.RequestHandler):

    @webapp2.cached_property
    def jinja2(self):
        return jinja2.get_jinja2(app=self.app)

    def render_template(self, filename, **kwargs):
        self.response.write(self.jinja2.render_template(filename, **kwargs))

class EmployeesHandler(BaseHandler):
    @login_required
    def get(self,**kwargs):
        user = users.get_current_user()
        company = models.Company.query().fetch(1)
        employees = models.Employees.query().fetch()
        vehicles = models.Vehicles.query().fetch()

        params = {
            "nickname" : user.nickname(),
            "company" : company,
            "employees" : employees,
            "vehicles" : vehicles
            }
        return self.render_template('employee.html', **params)

--- 模板 --- 这是模板的一部分

<table class="table table-striped table-bordered table-condensed">
  <thead>
    <tr>
      <th>Nome</th>
      <th>Cognome</th>
      <th>Email</th>
      <th>Ruolo</th>
      <th>Carta di credito</th>
      <th>Scadenza</th>
      <th>Auto</th>
      <th>Ultimo accesso</th>
      <th>Ultimo movimento</th>
    </tr>
  </thead>
  <tbody>
    {% for emp in employees %}
    <tr>
      <td>{{ emp.name }}</td>
      <td>{{ emp.surname }}</td>
      <td>{{ emp.email }}</td>
      <td>{{ emp.job }}</td>
      <td>{{ emp.credit_card }}</td>
      <td>{{ emp.cc_expiry_date }}</td>
      <td>({{ emp.vehicle.vehicle_registration }})</td>
      <td>{{ emp.last_login }}</td>
      <td>{{ emp.last_activity }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>

谁能告诉我获取雇员汽车登记号的正确方法? 提前致谢

问候, 罗伯托

【问题讨论】:

    标签: google-app-engine app-engine-ndb


    【解决方案1】:

    试试:emp.vehicle.get.vehicle_registration

    但是,你遇到了n+1 problem,你真的应该看看prefetching the vehicle reference.

    【讨论】:

    • 我尝试了 emp.vehicle.get.vehicle_registration,但它不起作用
    • @rp_189 仍然没有?,尝试仅打印 emp.vehicle
    • 正如 Shay 所说,如果 emp.vehicle 不是 None,emp.vehicle.get.vehicle_registration 应该可以工作。但是,您的代码和模板之间存在不一致; vehicle_registration 在 Employee 上,因此您应该尝试 emp.vehicle_registration(如果您的代码没有更改)。但是我不明白你为什么使用 Key(self.vehicle.kind(),int(self.vehicle.id())).get().registration;你应该可以使用 self.vehicle.get().registration。
    • @shay-erlichmen 如果我将 emp.vehicle 放在模板上,我得到了密钥
    • @GuidovanRossum emp.vehicle 不是 None,我没有使用 self.vehicle.get().registration 因为它不起作用。您关于 NDB 的文档很清楚,但我无法解决问题。如果我从处理程序访问 emp.vehicle_registration 我得到了值,但在模板上它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多