如何在发送到Jinja2模板之前处理查询? App Engine

时间:2017-06-07 22:05:45

标签: google-cloud-datastore jinja2 app-engine-ndb google-app-engine-python

在将查询结果发送到Jinja2以便在浏览器上呈现之前,我一直坚持如何处理查询结果。 我正在使用Google App Engine for Python开发应用程序。

我将工作时间存储在"日历"实体作为秒的数量,这将允许我进行一些关于时间的计算。我的问题是如何修改查询的结果,以便我传递给Jinja2 html文件的时间不是以秒为单位(整数)而是作为HH:MM(字符串)

我的models.py文件如下:

            'calendars_list': calendars_list,

class Calendar(ndb.Model):
    wtd1 = ndb.IntegerProperty()  # Working seconds day 1
    wtd2 = ndb.IntegerProperty()  #  " 2
    wtd3 = ndb.IntegerProperty()  #  " 3
    wtd4 = ndb.IntegerProperty()  #  " 4
    wtd5 = ndb.IntegerProperty()  #  " 5
    wtd6 = ndb.IntegerProperty()  #  " 6
    wtd7 = ndb.IntegerProperty()  #  " 7

在主请求处理程序中,我得到了查询(在定义祖先等之后)并且需要在浏览器中呈现之前将秒数更改为HH:MM。

        calendars_query = models.Calendar.query(ancestor = get_calendars_key()).order(models.Calendar.calendar_id)
        calendars_list = calendars_query.fetch(10)
        # Now: convert working times per day (sec) to HH:MM
        for calendar in calendars_list:
            calendar.wtd1 = format_as_HHMM(calendar.wtd1)
            --> Gives an error: calendar.wtd1 needs to be an integer, can't be a string


        template_values = {
            'calendars_list': calendars_list,
        }    

        template = JINJA_ENVIRONMENT.get_template('calendars.html')
        self.response.write(template.render(template_values))

如上所示,当我修改calendar.wtd1元素以将其从3600更改为01:00时,我收到错误,因为它需要是一个整数。

如何更改代码以便我可以正确处理查询结果?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码的问题是您尝试将不是整数的值分配给ndb.IntegerProperty()。

替换

calendar.wtd1 = format_as_HHMM(calendar.wtd1) 

calendar.wtd1_HHMM = format_as_HHMM(calendar.wtd1) 

并在模板中使用calendar.wtd1_HHMM,它可能很好用。

修改 如果您希望在模板中将整数转换为HH:mm作为表示逻辑的一部分,您可以通过编写转换函数并将其注册为过滤器(如documentation - writing filters

中所述)轻松完成

当涉及到进行转换的功能时,你很幸运: Python: convert seconds to hh:mm:ss