从基础(主)模板继承时堆栈溢出

时间:2016-05-15 22:16:29

标签: python html flask jinja2 flask-admin

我想扩展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 %}

现在我有了: enter image description here 我究竟做错了什么? 最近,我以同样的方式覆盖了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)

2 个答案:

答案 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