Flask 将数据传递给子模板

0 投票
1 回答
1160 浏览
提问于 2025-04-18 13:27

我想根据用户是否登录来显示稍微不同的导航栏。此外,下拉菜单的内容也会根据登录的用户而变化。

views.py 文件:

@app.route('/table')
def my_table:
    return render_template("table.html",
                            user = user,
                            my_names = my_names)

应用中的一个页面(/table):

{% extends "navbar.html" %}
{% block content %}
<html> A bunch of stuff </html>

简化的导航栏模板:

{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block navbar %}
    <html>
    <nav class="navbar navbar-default" role="navigation">
        <ul class="dropdown-menu" role="menu">
            <li><a href="#"> Signed in as: {{ user }} </a></li>
            <li class="divider"></li>
            {% for name in my_names %} 
                <li><a href="#"> {{ name }} </a></li>
            {% endfor %}
     </html>  
{% endblock %}

我想把 usermy_names 传递给导航栏模板。这两个数据会根据登录的用户而变化。

我这样想对吗?我的结构还好吗?我应该使用一些东西来简化这个过程吗(比如 Blueprints)?

(我知道可以通过 g.user 获取用户信息,因为它在所有模板中都是全局的)

1 个回答

0

因为你已经在g中设置了用户,所以你已经有了大部分需要的内容。剩下的就是正确设置菜单。

最简单的方法是使用一个上下文处理器

@app.context_processor
def provide_menu():
    menu = derive_menu_from_global_user()
    return {'menu': menu}

这样每个模板都会有一个menu变量,这个变量包含一个名字列表,你可以对这个列表进行遍历。

撰写回答