【问题标题】:Accessing Class methods in Jinja2 templating在 Jinja2 模板中访问类方法
【发布时间】:2018-10-01 15:25:53
【问题描述】:

我在后端使用 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 函数(这是我之前所做的)。

非常感谢任何帮助 - 如果您需要任何进一步的说明,请告诉我。

【问题讨论】:

    标签: python python-3.x flask jinja2


    【解决方案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 %}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-30
      • 2020-07-13
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 2013-05-15
      相关资源
      最近更新 更多