【问题标题】:Pass SQLAlchemy Query to Base Jinja Template将 SQLAlchemy 查询传递给基本 Jinja 模板
【发布时间】:2014-05-28 19:49:06
【问题描述】:

我正在使用 Flask、SQLAlchemy 和 Jinja 创建一个应用程序。我的应用程序中几乎每个页面都使用base.html 文件(本质上是一个带有导航栏和侧边栏的外壳),然后在此基础上构建。我在base.html 文件中显示作为 SQLAlchemy 查询结果的信息:

user.company.users.filter(User.account_approved == False).all()

现在我通过以下方式将其传递给单个视图:

@splash.route('/dashboard')
@login_required
def dashboard():
    return render_template('templates/dashboard.html', pendingUsers=g.user.company.users.filter(User.account_approved == False).all())

但是,这只允许base.html 视图在我加载/dashboard 路由时拥有此信息,并且如果我加载使用相同base.html 文件的任何其他路由,则运行{{ pendingUsers}} 不会输出文本。如何在使用base.html 的每条路由中呈现该查询?我尝试直接在 jinja 模板中进行查询,但我不知道该怎么做(例如,运行 {{ g.user.company.users }} 只是输出了该 SQLAlchemy 语句的 SQL 查询。

【问题讨论】:

    标签: sqlalchemy flask jinja2 flask-sqlalchemy python-decorators


    【解决方案1】:

    你正在做的事情是行不通的,因为当你在 render_template 中调用它时,你的查询没有被评估。相反,sql 查询字符串按原样发送到模板。

    您可以使用自定义装饰器,因为只有希望对某些视图/页面执行此操作。

    def get_pending_users(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            pending_users = user.company.users.filter(User.account_approved == False).all()
            if g.pending_users is None:
               g.pending_users = pending_users
            return f(*args, **kwargs)
        return decorated_function
    

    在你看来,你可以这样称呼它:

    @app.route('/',methods = ['GET','POST])
    @get_pending_users
    def whatever():
        return render_template('templates/dashboard.html')
    

    然后,在您的模板中,只需调用 g.pending_users

     {{ g.pending_users }}
    

    【讨论】:

    • 我只想在某些页面上运行它(那些使用base.html 的页面)。如何将其变成可以在这些页面之前调用的自定义装饰器?
    • 但是您在问题中说“我的应用程序中的每个页面都使用 base.html..”。所以我假设每个模板都会扩展 base.html,不是吗?
    • 抱歉,我说错了,只是修改了问题。应用程序中的几乎每个页面都使用它,但有些页面没有。这个方法还能用吗?
    猜你喜欢
    • 2014-12-17
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    相关资源
    最近更新 更多