我正在使用Flask Admin(https://github.com/jonalxh/Flask-Admin-Dashboard),我对此表示怀疑。
假设我有一个具有以下特征的模型:
产品
序列号
价格
我一直在寻找一种显示新行的方法,该行将显示库存产品的总价格。
有人可以指出我正确的方向吗?
谢谢。
我已经研究过这个问题,但是当我显示自定义视图时,我无法像在“标准”模型视图上那样执行CRUD操作:How do you add a summary row for Flask-Admin?
P.S:我正在学习python,所以请问这是我在浪费时间的基本问题
答案 0 :(得分:1)
在引用的question的答案中概述的方法也可以与Flask-Admin-Dashboard一起使用。
我已经在Github上创建了一个示例项目Flask-Admin-Dashboard-Summary。
以下是基本概念。
要显示汇总表,视图需要:
设置Jinja模板
templates/admin/model/summary_list.html
是list.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()