Jinja2 宏参数不扩展
Jinja2 macros argument doesn't expand
我有一个定义如下的宏:
{% macro render_row (class_suffix, form, field) %}
<div class="form-{{ class_suffix }}__row">{{ form.field.label }} {{ form.field() }}</div>
{% endmacro %}
我想传递一个 form
对象和一个 field
参数来呈现特定行,如下所示:
{% 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)
应该扩展为:
<div class="form-login__row">{{ form.email.label }} {{ form.email() }}</div>
相反,我收到此错误:
jinja2.exceptions.UndefinedError: 'blog.forms.SignInForm object' has no attribute 'field'
表单定义如下:
class SignInForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email(), Length(max=64)])
password = PasswordField('Password', validators=[DataRequired(), Length(min=8, max=64)])
我也找到了解决方法,但我很好奇为什么以前的方法不起作用。
{% 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) }}
可以吗?我究竟做错了什么?做这样的事情甚至是一个好习惯吗?
这是因为 Jinja2 试图从传递的表单对象中获取名为 field
的 属性,而不是名称等于传递的变量 field
的字段。
它试图做到
{{ foo.field }}
{{ foo['field'] }}
但是对于你的情况,当然,它只能使用这种语法。
{{ foo[field] }}
我认为宏的 field
参数应该是一个字符串,现在我认为是 None
.
所以应该是
{{ macros.render_row ('login', form, 'email') }}
和宏定义一样
{% 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。
I haven't tested it in real files, not have Jinja2 installed in my hands. But it should be working like that.
我有一个定义如下的宏:
{% macro render_row (class_suffix, form, field) %}
<div class="form-{{ class_suffix }}__row">{{ form.field.label }} {{ form.field() }}</div>
{% endmacro %}
我想传递一个 form
对象和一个 field
参数来呈现特定行,如下所示:
{% 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)
应该扩展为:
<div class="form-login__row">{{ form.email.label }} {{ form.email() }}</div>
相反,我收到此错误:
jinja2.exceptions.UndefinedError: 'blog.forms.SignInForm object' has no attribute 'field'
表单定义如下:
class SignInForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email(), Length(max=64)])
password = PasswordField('Password', validators=[DataRequired(), Length(min=8, max=64)])
我也找到了解决方法,但我很好奇为什么以前的方法不起作用。
{% 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) }}
可以吗?我究竟做错了什么?做这样的事情甚至是一个好习惯吗?
这是因为 Jinja2 试图从传递的表单对象中获取名为 field
的 属性,而不是名称等于传递的变量 field
的字段。
它试图做到
{{ foo.field }}
{{ foo['field'] }}
但是对于你的情况,当然,它只能使用这种语法。
{{ foo[field] }}
我认为宏的 field
参数应该是一个字符串,现在我认为是 None
.
所以应该是
{{ macros.render_row ('login', form, 'email') }}
和宏定义一样
{% 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。
I haven't tested it in real files, not have Jinja2 installed in my hands. But it should be working like that.