python - 在 Jinja2 模板中访问类方法
问题描述
我在后端使用 Flask 应用程序,它应该使用 Jinja2 模板内的循环在前端呈现 SKU(库存单位)代码列表。SKU类如下:
class SKU:
"""Class to hold SKU data returned from the database."""
def __init__(self, sku, scanned_at, actual_count, expected_count):
"""Initialize the SKU class with relevant attributes."""
self.sku = str(sku)
self.scanned_at = str(scanned_at)
self.actual_count = int(actual_count)
self.expected_count = int(expected_count)
def get_progress(self):
"""Get the SKU production progress as a percentage."""
return ((self.actual_count / self.expected_count) *
100 if self.expected_count != 0 else 0)
我有一个方法get_all_skus_today()
可以返回数据库中今天日期的所有行,作为SKU
对象列表。/skus
当有人通过以下路线访问时,我想渲染它:
@app.route("/skus")
def skus():
"""Get all SKUs for the day and render the skus.html template."""
skus = get_all_skus_today()
return render_template("skus.html", skus=skus)
问题是我要显示进度值,也就是函数的返回,get_progress()
不是Class属性,而是方法。我想做这样的事情:
{% for sku_row in skus %}
{{ sku_row.sku }}
{{ sku_row.get_progress }}
{% endfor %}
但这不起作用。我想避免遍历 SKU 对象列表并将它们转换为元组然后传递给render_template
函数(这是我之前所做的)。
非常感谢任何帮助 - 如果您需要任何进一步的说明,请告诉我。
解决方案
您可以创建一个附加类来加载和处理数据库中的信息并创建Sku
对象列表:
import sqlite3
class _Sku:
def __init__(self, row):
self.__dict__ = dict(zip(row, ['_sku', 'scanned_at', 'actual_count', 'expected_count']))
@property
def sku(self):
return str(self._sku)
@property
def get_progress(self):
return ((int(self.actual_count) / int(self.expected_count)) *
100 if int(self.expected_count) != 0 else 0)
class Sku:
def __init__(self, _listing):
self.all_vals = [_Sku(i) for i in _listing]
def __iter__(self):
yield from self.all_vals
@classmethod
def create_skus(cls, _filename='somefilename.db'):
#if so desired, you can replace query below with your own
return cls(sqlite3.connect(_filename).cursor().execute("SELECT scanned, actual, expected FROM skus"))
然后,在应用程序中:
@app.route("/skus")
def skus():
"""Get all SKUs for the day and render the skus.html template."""
return render_template("skus.html", skus=Sku.create_skus())
现在,上面的代码将能够利用您的原始模板:
{% for sku_row in skus %}
{{ sku_row.sku }}
{{ sku_row.get_progress }}
{% endfor %}
推荐阅读
- sql - sql将具有相同日期的行合并
- apache-spark - 在单个 jvm 机器上运行 16 个进程
- sql - 需要检索位于两列之间的值
- c# - GlobalConfiguration.Configure(WebApiConfig.Register) 和 Umbraco 的问题
- javascript - 触发 ckeditor 嵌入插件并传递 url 和所需参数
- grails - 如何在grails 3中绑定时间?
- python - 如何将字典(从类的方法返回)附加到列表中,而不会在 python 中被覆盖
- java - WebSocket 握手期间出现 Java 错误的 webSocket:404
- node.js - 将对象放置到 mongoDb 中的根级别
- java - JUnit 和 Mockito 在模拟时返回 null