Jinja 宏调用时报错 TypeError: 'HTMLString' object is not callable

基于本书 P120 的一个疑问:
首先说一下对macro的个人理解,不一定正确。
宏,我认为应该理解成“替换”,而不是理解成函数。

我照着4-9练的代码,主页代码如下:
{{ form_field(form.username(placeholder="haha")) }}

宏代码如下:
{% macro form_field(field) %}
{{ field.label }}

{{ field }}

{% endmacro %}

如果在宏定义的field中加上**kwargs 就会出现一个错误:
TypeError: 'HTMLString' object is not callable
如果把macro理解成替换,我觉得此处4-9的**kwargs应该是不需要的。因为宏会把主模板中的 form.username(placeholder="haha") 全部替换进去。
-----追加割-----

如果把其它参数也当成宏的参数,则**kwargs是生效的。当然这是基于两种不同的理解。

120 页原文这里的 form_field 宏是这样设计的:

定义里参数 field 是一个字段类对象,你需要传入对象({{ form_field(form.username) }})而不是一个调用({{ form_field(form.username(placeholder='foo')) }})。

如果你想传递其他关键字参数,需要这样做:

{{ form_field(form.username, placeholder='foo') }}

而如果你直接传递一个调用进来,那么首先报错的是 {{ field.label }}。因为传入的调用会返回一个渲染好的表单 HTML 字符串,所以没法继续调用 label 属性,也就是你看到的「TypeError: ‘HTMLString’ object is not callable」。

1 Like

另外关于 **kwargs 还可以参考这篇《如何向Jinja宏传递额外参数(*args和**kwargs)?

1 Like