首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jinja2宏参数不会扩展

Jinja2宏参数不会扩展
EN

Stack Overflow用户
提问于 2019-12-12 23:48:27
回答 1查看 441关注 0票数 0

我有一个宏,定义如下:

代码语言:javascript
复制
{% macro render_row (class_suffix, form, field) %}
<div class="form-{{ class_suffix }}__row">{{ form.field.label }} {{ form.field() }}</div>
{% endmacro %}

我想传递一个form对象和一个field参数来呈现一个特定的行,如下所示:

代码语言:javascript
复制
{% import "macros.html" as macros %}
...
<div class="form-container">
    <h2>Sign In</h2>
    <form class="form-login" action="{{ url_for('signin') }}" method="post">
        {{ macros.render_row ('login', form, email) }}
        {{ macros.render_row ('login', form, password) }}
        {{ macros.render_submit ('login', 'Sign In') }}
        {{ form.csrf_token }}
    </form>
</div>

例如,应该将macros.render_row ('login', form, email)扩展为:

代码语言:javascript
复制
<div class="form-login__row">{{ form.email.label }} {{ form.email() }}</div>

相反,我得到了这个错误:

代码语言:javascript
复制
jinja2.exceptions.UndefinedError: 'blog.forms.SignInForm object' has no attribute 'field'

表单的定义如下:

代码语言:javascript
复制
class SignInForm(FlaskForm):
    email = StringField('Email', validators=[DataRequired(), Email(), Length(max=64)])
    password = PasswordField('Password', validators=[DataRequired(), Length(min=8, max=64)])

我也找到了一个解决方案,但我很好奇为什么以前的方法不起作用。

代码语言:javascript
复制
{% macro render_row (class_suffix, form_field) %}
<div class="form-{{ class_suffix }}__row">{{ form_field.label }} {{ form_field() }}</div>
{% endmacro %}
...
{{ macros.render_row ('login', form.email) }}

做得到吗?我做错了什么?做这样的事是一个很好的练习吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-13 00:10:02

这是因为Jinja2试图从传递的表单对象中获取名为field的属性,而不是名称等于传递的变量field的字段。

它试着做

代码语言:javascript
复制
{{ foo.field }}
{{ foo['field'] }}

当然,对于您的情况,它只能使用这个语法。

代码语言:javascript
复制
{{ foo[field] }}

我认为宏的field参数应该是一个字符串,现在我认为它是None

所以应该是

代码语言:javascript
复制
{{ macros.render_row ('login', form, 'email') }}

以及宏类的定义

代码语言:javascript
复制
{% macro render_row (class_suffix, form, field) %}
<div class="form-{{ class_suffix }}__row">{{ form[field].label }} {{ form[field]() }}</div>
{% endmacro %}

检查有关变量语法页https://jinja.palletsprojects.com/en/2.10.x/templates/#variables的更多详细信息。

--我还没有在真正的文件中测试过它,也没有在我手中安装过Jinja2。但它应该是那样工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59314298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档