我正在使用Flask,SQLAlchemy和Jinja创建一个应用程序。我的应用程序中的几乎每个页面都使用base.html
文件(本质上是一个带有导航栏和侧边栏的shell),然后在此基础上构建。我在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
文件的任何其他路由,则运行{ {1}}输出不是文字。如何在使用{{ pendingUsers}}
的每个路径中渲染该查询?我尝试直接在jinja模板中进行查询,但我无法弄清楚如何做到这一点(例如,运行base.html
只是输出SQLAlchemy语句的SQL查询。
答案 0 :(得分:2)
当你在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 }}