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))
我是编码初学者,目前正在学习 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))