โปรเจ็กต์นี้สร้างขึ้นเพื่อตอบคำถาม SO นี้ - โมเดลผู้ดูแลระบบ Flask - แถวสรุป คำถามอ้างอิงถึงคำถาม SO ก่อนหน้า คุณจะเพิ่มแถวสรุปสำหรับ Flask-Admin ได้อย่างไร
โปรเจ็กต์นี้เป็นโคลนของ Flask-Admin-Dashboard พร้อมมุมมองพิเศษ (โปรเจ็กต์) ที่แสดงวิธีเพิ่มแถวสรุปไปยังมุมมองรายการ Flask-Admin
โครงการนี้แตกต่างจากโครงการเดิม:
create-database
ที่กำหนดใน commands.py โปรเจ็กต์มาพร้อมกับฐานข้อมูลที่เตรียมใช้งานล่วงหน้า ( sample_db.sqlite
) หากต้องการสร้างฐานข้อมูลใหม่จาก CLI ในรูทของการรันโปรเจ็กต์:
> flask create-database
จาก CLI ในรูทของการรันโปรเจ็กต์:
> flask run
* Serving Flask app "app/__init__.py"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
ในการแสดงตารางสรุป มุมมองจะต้อง:
templates/admin/model/summary_list.html
เป็นสำเนาโดยตรงของ list.html
สังเกตชื่อไฟล์ 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 %}
views.py
เริ่มต้นที่บรรทัด 60
บรรทัดที่ 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)
โปรดสังเกตการตรวจสอบแบบมีเงื่อนไขบนเทมเพลตเนื่องจากเราไม่ได้เกี่ยวข้องกับการเรนเดอร์การแก้ไข/สร้าง และการแทรกพจนานุกรม summary_data
ลงในอาร์กิวเมนต์ **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()