wtforms 表单字段是 class objects 还是函数?

Is wtforms form fields are class objects or functions?

将 wtforms 与 flask 结合使用,我可以为每个字段创建 object 并将参数作为标题和验证器列表传递,但是当将这些 object 添加到 HTML 模板时,我可以通过CSS class 也作为参数。我可以初始化一个 class object 两次吗?或者字段是函数? 在此处的代码中:

python:

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(),Length(min=2,max=20)])

HTML:

<div class="form-group">
                   {{ form.username.label(class="form-control-label") }}
                   {{ form.username(class="form-control form-control-lg") }}
               </div>

如果用户名是 class 的 object 如何在构造后将参数传递给 object 如果它是一个函数我如何访问 username.label?我需要一个解释,因为我是 python(来自 c++)的新手。

python中的任何对象只要定义了__call__方法就可以作为函数调用。该方法接收调用时给出的参数(下面的 **kwargs 语法表示“将所有未定义的关键字参数收集到名为 kwargs 的字典中 - 关键字参数是参数名称在值之前定义的参数调用函数):

class Foo:
  def __call__(self, **kwargs):
    print(kwargs)

a = Foo()
a(foo="bar")
>>> {'foo': 'bar'}

但是,模板语言在这种情况下提供了一些帮助,因为您通常不能将名为 class 的参数直接提供给函数:

>>> a(class="bar")
  File "<stdin>", line 1
    a(class="bar")
      ^
SyntaxError: invalid syntax

您可以在纯代码中解决这个问题,方法是创建一个字典来保存您的函数参数,然后在调用函数(或在本例中为对象的 __call__ 方法)时将其扩展为关键字参数:

>>> args = {'class': 'bar'}
>>> a(**args)
{'class': 'bar'}

由于这只会影响对象作为函数调用的情况,因此访问 .label 等属性不会改变任何其他内容。