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
等属性不会改变任何其他内容。
将 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
等属性不会改变任何其他内容。