在Jinja2模板中访问类方法

时间:2018-10-01 15:25:53

标签: python python-3.x flask jinja2

我在后端使用Flask应用程序,该应用程序应该使用Jinja2模板中的循环在前端呈现SKU(库存单位)代码列表。 SKU类如下:

href

我有一个方法click,它以当天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的返回,该函数不是Class属性,而是方法。我想做这样的事情:

@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)

但这不起作用。我想避免不必遍历SKU对象列表并将它们转换为元组,然后传递给get_progress()函数(这是我之前所做的事情)。

非常感谢您的帮助-如果您需要进一步的澄清,请告诉我。

1 个答案:

答案 0 :(得分:1)

您可以创建一个额外的类来加载和处理数据库中的信息,并创建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 %}