Flask-Nav 允许dynamic construction;但是,我无法弄清楚如何通过将字典或列表传递给构建Navbar的函数来实现这一目的。
@nav.navigation
def top_nav():
# ...
根据文档,每次需要Navbar时都会调用它;但是,您可以执行类似top_nav(items)或类似的操作。
在我的Jinja2模板中,我创建了一个包含该页面子菜单的字典(我想将其作为侧边菜单以及顶部固定导航栏)。我知道它可以用宏的方式完成但我很好奇是否有办法使用Flask-Nav创建带有动态传递项的辅助Navbar。
答案 0 :(得分:2)
嗯,对于这个问题,我真的很晚了,但是我希望这可以帮助路过的人们。我不完全了解您要如何继续(一些代码会有所帮助),但是字典只是可以解析的项目的集合,可以使用我将要描述的方法添加到导航栏中。这些是我用来为项目中的旁边菜单创建动态导航栏的步骤(导航栏元素由各个模块添加):
contextbar = Navbar('Context menu')
(当然,需要扩展名flask-nav
)nav.register_element('contextbar', contextbar)
create_app()
函数中的初始化应用程序(这是标准的Flask工厂构造):nav.init_app(app)
对于我创建的每个程序包/模块,我将以下内容添加到__init__.py
文件中(“ application”当然是我的应用程序的名称):
from flask import current_app as app
from flask_nav.elements import View
from application import contextbar
最后,仍然放在模块的__init__.py
文件中,我使用@app.before_first_request
装饰器来确保只添加一次导航栏添加(而不是每个 request)以避免重复的项目,并且代码如下
# Add elements to the contextual navigation bar
@app.before_first_request
def before_first_request():
contextbar.items.append(View('Meow', 'path.to.blueprint.meow'))
contextbar.items.append(View('Bark', 'path.to.blueprint.bark'))
这样,每个模块都可以添加自己的菜单项(即使不要求该特定模块的路由)。为了完整起见,在jinja2模板中,您只需要在要导航栏呈现的位置添加代码{{nav.contextbar.render()}}
。
我必须承认我对Python,Flask和朋友还很陌生,但这是我在我的(测试/教程/示例)项目中所做的,并且运行良好。
更新
我在登录/注销时遇到了一些问题,因为在登录之前,该用户未通过身份验证,并且导航栏将显示“ login”,但是此后导航栏不会更改(before_each_request
不会触发再次针对相同的“会话”),这不好。因此,我稍加注意就切换到before_request
:
在主应用程序的routes.py
中,添加以下代码以初始化导航栏并从“无项目”开始
@app.before_request
def before_request():
# Only perform adding items to contextbar for non-static GET requests
if request.method == 'GET' and request.endpoint not in ('static',):
# Reset bar's items to avoid duplicates after each request
contextbar.items = []
# Add first link to the top bar
contextbar.items.append(View('Home', 'homepage'))
在模块的每个__init__.py
文件中,我从“ 5”点添加相同的代码,但没有重置导航栏项目:
@app.before_request
def before_request():
# Only perform adding items to contextbar for non-static GET requests (POST requests usually do not need nav bars)
if request.method == 'GET' and request.endpoint not in ('static',):
# This is added to make sure these links are added only if the user is logged in
if current_user.is_authenticated:
contextbar.items.append(View('Bark', 'path.to.blueprint.bark'))
# This link will be added to the navbar for logged in and out users
contextbar.items.append(View('Meow', 'path.to.blueprint.meow'))
答案 1 :(得分:0)
我是这样的
from flask_nav import Nav
from flask_nav.elements import Navbar, View
from flask_login import current_user
nav = Nav()
@nav.navigation()
def mynavbar():
if current_user.is_authenticated:
return Navbar(
'Title',
View('Home', 'index' ),
View('Servizi', 'servizi' ),
View('Logout', 'logout' )
)
else:
return Navbar(
'Title',
View('Home', 'index' ),
View('Login', 'login' )
)
因此,如果用户已登录,我会显示更多项目