WTForms中的StringField如何在HTML文件中创建字段

How does StringField in WTForms Create Fields in HTML File

我是编码初学者,目前正在学习 Python。我最近一直在使用 Flask 和 WTForms 创建注册表单。除了按照教程构建表单之外,我还尝试稍微了解它并了解它是如何工作的(一般来说)。所以我的问题是关于 StringField 的。

我创建了一个名为 registr.html 的 html 文件,它将被渲染。在这个 html 文件中,有两行代码会创建一个字段供用户输入用户名,如下所示:

{{ form.username.label }}

{{ form.username }}

在我的 Python 应用程序中,我在下面创建了一些内容,例如 A 部分:

from flask_wtf import FlaskForm
from wtforms import StringField
from wtforms.validators import DataRequired

class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired()])

在下面,说 B 部分:

@app.route("/register", methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
return render_template('register.html', title='Register', form=form)

这是我的问题。我知道 form.username.label 会将标签“用户名”放在输入字段上方,以便人们知道这是他们输入用户名的地方。然后我认为 form.username 所做的实际上是创建一个字段,以便人们可以在其中输入内容。所以我的理解是 username 是一个等于 StringField('Username', validators=[DataRequired()]) 的属性,这是 class StringField 的对象,并且由于 form 等于 RegistrationForm(), 所以在 html 文件中执行 form.username 就像执行 Registration.StringField('Username', validators=[ DataRequired()])。我说的对吗?如果是这样,执行对象 StringField('Username', validators=[DataRequired()]) 如何在 html 中创建输入字段?我们可以执行一个对象吗?我认为我们只能在 class 中执行一个方法,对吗?所以一定有其他我不明白的事情发生了。同样,我仍然是初学者,正在学习 Python。所以非常感谢任何帮助!

有一个默认的渲染小部件。如果您需要呈现自定义 HTML (https://wtforms.readthedocs.io/en/stable/widgets.html),您可以覆盖小部件。具体使用的渲染小部件在这里:

class Input(object):
    """
    Render a basic ``<input>`` field.
    This is used as the basis for most of the other input fields.
    By default, the `_value()` method will be called upon the associated field
    to provide the ``value=`` HTML attribute.
    """

    html_params = staticmethod(html_params)

    def __init__(self, input_type=None):
        if input_type is not None:
            self.input_type = input_type

    def __call__(self, field, **kwargs):
        kwargs.setdefault("id", field.id)
        kwargs.setdefault("type", self.input_type)
        if "value" not in kwargs:
            kwargs["value"] = field._value()
        if "required" not in kwargs and "required" in getattr(field, "flags", []):
            kwargs["required"] = True
        return Markup("<input %s>" % self.html_params(name=field.name, **kwargs))