2016-05-15 15 views
1

Ich möchte access_control erweitern, um Authentifizierungsmenüverknüpfungen hinzuzufügen. Ich will nicht ganz master.html Vorlage zu überschreiben, so dass ich erstellen Vorlagen/admin/mymaster.html-Datei mit folgendem Inhalt:Stapelüberlauf beim Erben von Basisvorlage (Mastervorlage)

{% extends 'admin/master.html' %} 
{% block access_control %} 
    {{ super() }} 
     <ul class="nav navbar-nav navbar-right"> 
      <...> 
     </ul> 
{% endblock %} 

Jetzt habe ich: enter image description here Was mache ich falsch ? In letzter Zeit habe ich außer Kraft gesetzt admin/index.html gleiche Art und Weise:

{% extends 'admin/master.html' %} 
{% block body %} 
    <p>Here I'm going to display some data.</p> 
{% endblock %} 

und es gut funktioniert.

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

es soll nicht die übergeordneten Punkte '() ', wie in der Django-Vorlage ist die Methode bereits aufrufbar. Haben Sie versucht, nur '{{block.super}}' zu verwenden? – Anzel

+0

in Jinga2 sollte es super() sein, wenn Block zu erweitern, sowieso spielt es keine Rolle, Super spielt keine Rolle, da es Vererbungsproblem ist. – aryndin

+0

Nun, Sie sollten wirklich jinja2 in Ihrer Frage erwähnen, um Verwirrung zu vermeiden. – Anzel

Antwort

0

Flask-admin-Dokumentation ist ein wenig verwirrend, weil es Ihnen sagt:

können Sie auch die Master-Vorlage außer Kraft setzen, aber dann müssen Sie Ihre eigene Vorlage Namen der zu übergeben Admin-Konstruktor:

admin = Admin(app, base_template='my_master.html')

Flask-admin verwendet Proxy-Vorlage, mit dem Namen m Aster.html und enthielt nur eine folgende Zeile:

{% extends admin_base_template %} 

Wenn wir base_template in unserem Admin Konstruktor admin_base_template Variable wird außer Kraft gesetzt zu unserer neuen my_master/my_base Vorlage übergeben, so dass wir von ihm nicht nur erben können, sonst würde es dazu führen, zyklisch erben und Stapelüberlauf. Anstatt von admin/master zu erben, sollten wir nur admin/base.html erben. Auf diese Weise meine Lösung wird:

<-- admin/mymaster.html --> 
{% extends 'admin/base.html' %} 
{% block access_control %} 
    {{ super() }} 
     <ul class="nav navbar-nav navbar-right"> 
      <...> 
     </ul> 
{% endblock %} 

Jetzt alle Vorlagen, die Sie von admin/master.html (wie bisher) nur erben, weil es an neuer Basis/MyMaster

+1

"wir sollten einfach admin/base.html erben." das habe ich dir gesagt. "Sie überschreiben admin/base.html nicht admin/master.html". – wgwz

2

denke ich, das Problem mit dieser Linie ist, die eine eigene Basis Template erstellen gemeint ist.

flaskadmin = admin.Admin(name='Flasky', template_mode='bootstrap3', 
        base_template='admin/mymaster.html') 

See: 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`. 

Es scheint mir, dass dies nicht das, was Sie tun möchten. Wenn Sie den Anwendungscode wie folgt ändern, tritt das Rekursionsproblem nicht auf.

flaskadmin = Admin(name='Flasky') 

Von dem, was ich sagen kann, ob Sie die Basisvorlage Sie admin/base.html nicht admin/master.html außer Kraft setzen außer Kraft setzen möchten.

Zum Beispiel:

. 
├── 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' %} 

templates/admin/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 %} 
+0

Ich denke, Flask-Admin-Dokumentation ist ein wenig verwirrend: 'Sie können auch überschreiben die ** Master ** Vorlage, aber dann müssen Sie Ihre eigene Vorlage Name an den Admin-Konstruktor übergeben:' admin = Admin (App, base_template = 'my_master.html') https://github.com/mrjoes/flask-admin/blob/master/doc/templates.rst#customizing-templates – aryndin