【发布时间】:2016-11-25 08:36:52
【问题描述】:
我正在使用 Flask 0.11.1 和 Flask-Admin 1.4.2 在 Python 3.5 中构建一个小型 Web 应用程序。
我希望网站的所有用户都可以使用 Flask-Admin 作为管理界面,而不是使用 Flask-Admin 作为管理界面(以利用 Select2 JS 生成的令人敬畏的 CRUD 生成) lib、内联表单、带有过滤功能的列表视图等)。
考虑到这一点,我想覆盖列表视图模板以更加用户友好。为此,我正在执行以下操作。
首先,在我看来,我会覆盖list_template:
from flask_admin.contrib.sqla import ModelView
class FriendView(ModelView):
list_template = 'friend/list.html'
...
然后,我通过扩展admin/model/list.html 并覆盖其中定义的块model_list_table 来编写friend/list.html 文件:
{% extends 'admin/model/list.html' %}
{% block model_list_table %}
{% for row in data %}
<div class="col-xs-6 col-sm-4 col-md-3">
{% include 'friend/panel.html' %}
</div>
{% endfor %}
{% endblock %}
panel.html 文件代表一个引导程序 panel,说明每个朋友:
<div class="panel panel-success">
<div class="panel-heading">
This friend is named {{ row.name }}.
</div>
<div class="panel-body">
{% block list_row_actions_column scoped %}
{{ super() }}
{% endblock %}
</div>
<div class="panel-footer">
...
</div>
</div>
问题出在这里:如您所见,我在panel.html 中使用了list_row_actions_column 块,这是admin/model/list.html 中定义的Jinja 块。
当然,这会引发以下错误:
jinja2.exceptions.UndefinedError: there is no parent block called 'list_row_actions_column'.
因为文件panel.html 没有扩展admin/model/list.html。
我尝试将panel 定义为Jinja macro 并将其导入friend/list.html,这会引发同样的错误...
我知道我不能简单地将面板分离到另一个文件中,但是我的 friend/list.html 非常大,我认为这样做是件好事,为了可读性和解耦。
有人知道我可以如何进行吗?
谢谢, 爱德华
【问题讨论】:
-
我认为这不会以这种方式工作。你需要反过来做,让
panel.html扩展你的list.html,扩展admin/model/list.html。这样您就可以访问list_row_actions_column。 -
您好,感谢您的回答。但是,我想在我的
list.html中添加多个panel。如果我的panel.html扩展了我的list.html,我需要将panel.html作为模板返回,这不是我想要的。
标签: python flask jinja2 flask-admin