我想扩展access_control块以添加身份验证菜单链接。我不想覆盖整个master.html模板,因此我创建了templates / admin / mymaster.html文件,其中包含以下内容:
{% extends 'admin/master.html' %}
{% block access_control %}
{{ super() }}
<ul class="nav navbar-nav navbar-right">
<...>
</ul>
{% endblock %}
现在我有了: 我究竟做错了什么? 最近,我以同样的方式覆盖了admin / index.html:
{% extends 'admin/master.html' %}
{% block body %}
<p>Here I'm going to display some data.</p>
{% endblock %}
并且效果很好。
MCVE:
from flask import Flask, redirect, url_for
from flask.ext.admin.base import MenuLink, Admin, BaseView, expose
app = Flask(__name__, template_folder='templates')
@app.route('/')
def index():
return '<a href="/admin/">Click me to get to Admin!</a>'
flaskadmin = admin.Admin(name='Flasky', template_mode='bootstrap3',
base_template='admin/mymaster.html')
flaskadmin.init_app(app)
# Start app
app.run(debug=True)
答案 0 :(得分:2)
我认为问题在于这一行,它旨在创建一个自定义基本模板。
flaskadmin = admin.Admin(name='Flasky', template_mode='bootstrap3',
base_template='admin/mymaster.html')
请参阅:https://github.com/flask-admin/flask-admin/blob/master/flask_admin/base.py#L490-L491
:param base_template: Override base HTML template for all static views. Defaults to `admin/base.html`.
在我看来,这不是你想要做的。如果您更改下面的应用程序代码,则不会发生递归问题。
flaskadmin = Admin(name='Flasky')
根据我的判断,如果您要覆盖基本模板,则覆盖 admin / base.html 而不是 admin / master.html 。
例如:
.
├── app.py
└── templates
└── admin
├── mybase.html
└── mymaster.html
app.py :
from flask import Flask
from flask.ext.admin.base import Admin
app = Flask(__name__)
@app.route('/')
def index():
return '<a href="/admin/">Click me to get to Admin!</a>'
flaskadmin = Admin(name='Flasky', base_template='admin/mybase.html')
flaskadmin.init_app(app)
if __name__ == '__main__':
app.run(debug=True)
templates / admin / mybase.html :
{% extends 'admin/base.html' %}
模板/管理/ mymaster.html :
{% extends 'admin/master.html' %}
{% block access_control %}
{{ super() }}
<ul class="nav navbar-nav navbar-right">
<li>One</li>
<li>Two</li>
</ul>
{% endblock %}
答案 1 :(得分:0)
Flask-admin文档有点令人困惑,因为它告诉你:
您也可以覆盖主模板,但是您需要传递 您自己的模板名称为Admin构造函数:
admin = Admin(app, base_template='my_master.html')
Flask-admin使用代理模板,名为master.html,只包含以下一行:
{% extends admin_base_template %}
当我们将base_template传递给Admin构造函数时,admin_base_template变量将被覆盖到我们的新my_master / my_base模板,因此我们不能继承它,否则会导致循环继承和堆栈溢出。我们应该继承admin / base.html,而不是从admin / master继承。这样,我的解决方案就变成了:
<-- admin/mymaster.html -->
{% extends 'admin/base.html' %}
{% block access_control %}
{{ super() }}
<ul class="nav navbar-nav navbar-right">
<...>
</ul>
{% endblock %}
现在您只需从admin / master.html继承所有模板(如前所述),因为它指向新的base / mymaster