我使用Flask-Login,它在模板中提供current_user
对象。我想编写一个宏来显示评论表单或登录链接,具体取决于用户是否已登录。如果我直接在模板中使用此代码,它可以工作:
{% if current_user.is_authenticated %}
{{ quick_form(form) }}
{% else %}
<a href="{{ url_for('auth.login') }}">Log In with Github</a>
{% endif %}
我在宏中放置了相同的代码并在我的模板中导入宏。
{% macro comment_form(form) %}
{% if current_user.is_authenticated %}
...
{% endif %}
{% endmacro %}
{% from "macros/comments.html" import comment_form %}
{% extends "base.html" %}
{% block content %}
{# ... content goes here ... #}
{{ comment_form(form) }}
{% endblock %}
当我尝试加载此页面时,我得到的错误是:
jinja2.exceptions.UndefinedError: 'current_user' is undefined
当然,简单的解决方法是传入current_user
作为参数并使用它(制作签名comment_form(user, form)
),尽管这是一个相当丑陋的解决方案(imo)。
为什么宏不使用上下文处理器?它不具备背景吗?
答案 0 :(得分:15)
呈现模板的上下文不会传递给导入,除非指示这样做。请参阅relevant docs。
你是对的,你不需要将上下文作为参数注入宏。您可以导入宏with context
,他们将可以访问导入模板的上下文。
{% from "macros/comments.html" import comment_form with context %}
答案 1 :(得分:1)
$('.bleu').click(function(e) {
alert($(this).attr('id'));
return false;
})
现在作为属性进行访问,调用方法定义将导致更新的库版本出现问题。
请参阅: https://flask-login.readthedocs.org/en/latest/#flask.ext.login.current_user
答案 2 :(得分:0)
根据jinja2 docs并非jinja2宏中的每个变量都可用。更改宏并将'current_user'作为参数发送给它:
% macro comment_form(form, current_user, disabled=False) %}
{% if current_user.is_authenticated() %}
{{ quick_form(form) }}
{% else %}
<p class="text-muted">You are not signed in. Please <a href="{{ url_for('auth.login') }}">Sign In With Github</a> to continue
</p>
{% endif %}
{% endmacro %}
这就是你将如何使用它:
{% from "macros/comments.html" import comment_form %}
{% extends "base.html" %}
{% block content %}
{# ... content goes here ... #}
{{ comment_form(form, current_user) }}
{% endblock %}