chuixing
(chuixing)
1
基于本书 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是生效的。当然这是基于两种不同的理解。
greyli
(Grey Li)
2
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 个赞
greyli
(Grey Li)
3
1 个赞