Flask管理员模型-摘要行

时间:2018-10-27 00:17:28

标签: python flask-sqlalchemy flask-admin

我正在使用Flask Admin(https://github.com/jonalxh/Flask-Admin-Dashboard),我对此表示怀疑。

假设我有一个具有以下特征的模型:

产品

序列号

价格

我一直在寻找一种显示新行的方法,该行将显示库存产品的总价格。

有人可以指出我正确的方向吗?

谢谢。

我已经研究过这个问题,但是当我显示自定义视图时,我无法像在“标准”模型视图上那样执行CRUD操作:How do you add a summary row for Flask-Admin?

P.S:我正在学习python,所以请问这是我在浪费时间的基本问题

1 个答案:

答案 0 :(得分:1)

在引用的question的答案中概述的方法也可以与Flask-Admin-Dashboard一起使用。

我已经在Github上创建了一个示例项目Flask-Admin-Dashboard-Summary

Summary Rows for Project View

以下是基本概念。

要显示汇总表,视图需要:

  • 将摘要值注入视图
  • 定义要使用的Jinja模板,并对其进行适当修改以使用注入的摘要值

设置Jinja模板

templates/admin/model/summary_list.htmllist.html的直接副本,来自Flask-Admin Bootstrap 3模板文件夹。

请注意文件名summary_list.html,因为它在视图定义的render方法中使用。

以下html块已插入到第163行:

{# This adds the summary data #}
{% for row in summary_data %}
<tr>
    {% if actions %}
    <td>
        {# leave this empty #}
    </td>
    {% endif %}
    {# This is the summary line title and goes in the action column, note that the action may not be visible!!! #}
    {% if admin_view.column_display_actions %}
        <td><strong>{{ row['title'] or ''}}</strong></td>
    {% endif %}
    {# This is the summary line data and goes in the individual columns #}
    {% for c, name in list_columns %}
        <td class="col-{{c}}">
            <strong>{{ row[c] or ''}}</strong>
        </td>
    {% endfor %}
</tr>
{% endfor %}

设置视图

第61行,定义要使用的模板:

# don't call the custom page list.html as you'll get a recursive call
list_template = 'admin/model/summary_list.html'

第75行,覆盖视图的render(self, template, **kwargs)方法:

def render(self, template, **kwargs):
    # we are only interested in the summary_list page
    if template == 'admin/model/summary_list.html':
        # append a summary_data dictionary into kwargs
        # The title attribute value appears in the actions column
        # all other attributes correspond to their respective Flask-Admin 'column_list' definition
        _current_page = kwargs['page']
        kwargs['summary_data'] = [
            {'title': 'Page Total', 'name': None, 'cost': self.page_cost(_current_page)},
            {'title': 'Grand Total', 'name': None, 'cost': self.total_cost()},
        ]
    return super(ProjectView, self).render(template, **kwargs)

请注意在第66和71行提供实际汇总数据的辅助方法,需要根据需要进行调整:

def page_cost(self, current_page):
    # this should take into account any filters/search inplace
    _query = self.session.query(Project).limit(self.page_size).offset(current_page * self.page_size)
    return sum([p.cost for p in _query])

def total_cost(self):
    # this should take into account any filters/search inplace
    return self.session.query(func.sum(Project.cost)).scalar()