我想在标签文本之前(或之后)添加“*”,以防需要提交。
我现在可以通过在我的模板中使用它来做到这一点:
{% for field in form %}
<label for="{{ field.name }}">
{{ '*' if field.flags.required }}{{ field.label.text }} :
</label>
{{ field }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
有没有比这更好的方法,至少有一种方法可以避免手动添加标签元素?
class Example_Form(Form):
field_1 = TextAreaField()
field_2 = TextAreaField()
def __init__(self, type, **kwargs):
super(Example_Form, self).__init__(**kwargs)
if type == 'type_1':
self.field_3 = TextAreaField()
Run Code Online (Sandbox Code Playgroud)
In some scenarios I need to dynamically add fields into the form. The field_3 added to example form turns out to be a UnboundField. I tried to bind field_3 to form in __init__ function, but it won't work.
field_3 = TextAreaField()
field_3.bind(self, 'field_3')
Run Code Online (Sandbox Code Playgroud)
How to bind field_3 to example form?
我需要在 wtforms 中创建一行单选按钮。所以:
buttons = RadioField(choices=[(0, 'Option1), (1, 'Option2'), (2, 'Option3')])
Run Code Online (Sandbox Code Playgroud)
创建:
我想得到的是:
选项1 选项2 选项3
(由于某种原因,实际的单选按钮不会在此处呈现)意思是我想要一排单选按钮,而不是无序列表的按钮。
在发布问题之前,我已经尝试自己解决问题。阅读这篇文章后:How can WTForms RadioField generated html without <ul> and <li> tag? 我在这里阅读了有关小部件和按钮的信息: https: //wtforms.readthedocs.io/en/stable/widgets.html#built-in-widgets 和这里: https: //wtforms.readthedocs.io/en/stable/ fields.html 似乎有一个内置小部件: class wtforms.widgets.Input(input_type=None) 可能会通过不将无序列表标记应用于单选按钮来解决问题。
我尝试按如下方式应用它:
buttons = RadioField(widget=Input(input_type='radio'), choices=[(0, 'Option1'), (1, 'Option2'), (2, 'Option3')])
Run Code Online (Sandbox Code Playgroud)
但我只收到错误: AttributeError: 'RadioField' object has no attribute '_value'
我的问题是:
class Form(Form):
def forms(self):
name = TextField('name', validators=[Required()])
class IndexHandler(tornado.web.RequestHandler):
def get(self):
form = Form()
self.render('index.html', form=form.forms())
Run Code Online (Sandbox Code Playgroud)
模板:
<form method="post" action="/test">
{% raw form.name(type='text') %}
</form>
Run Code Online (Sandbox Code Playgroud)
错误:
AttributeError:'NoneType'对象没有属性'name'
但这有效,但是我需要在Form类中使用一个函数:
class Form(Form):
name = TextField('name', validators=[Required()])
class IndexHandler(tornado.web.RequestHandler):
def get(self):
form = Form()
self.render('index.html', form=form)
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
class ReconForm(Form):
compressedFilePath = StringField('Compressed File Path', [validators.Required()] )
Run Code Online (Sandbox Code Playgroud)
我像这样实例化它:
form = ReconForm()
form.compressedFilePath.default = 'hey'
Run Code Online (Sandbox Code Playgroud)
它什么都不做。它曾经将默认值设置为 hey 但后来它停止了,我不知道为什么。
如果我打印 form.compressedFilePath.default 然后它打印正确的值。如果我在字段构造函数中设置默认值,模板会呈现正确的值。否则它什么都不做,它让我发疯。
我究竟做错了什么?
我正在使用带有WTForms和SQLAlchemy的Flask.我目前有这个设置:
一个SQLAlchemy类:
class User(Base):
__tablename__ = 'user'
name = db.Column(db.String)
last_name = db.Column(db.String)
__init__(name, last_name):
self.name = name
self.last_name = last_name
Run Code Online (Sandbox Code Playgroud)
相应的表格:
class CreateUserForm(Form):
name = StringField('Name')
last_name = StringField('Last name')
Run Code Online (Sandbox Code Playgroud)
路线:
@user.route('/', methods=['POST'])
def create():
form = CreateUserForm(request.form)
if form.validate():
user = User(form.name.data, form.last_name.data)
...
Run Code Online (Sandbox Code Playgroud)
这只是一个简化的例子,但我想知道的是,如果我能以某种方式将表单变量传递给User构造函数并一直传递给SQLAlchemy中的User类?由于构造函数中的表单与用户数据库表中的字段相同,因此它会很好.
我希望我的路线看起来像这样:
@user.route('/', methods=['POST'])
def create():
form = CreateUserForm(request.form)
if form.validate():
user = User(form)
...
Run Code Online (Sandbox Code Playgroud)
所以我不必在每个部分中处理form.name和form.last_name.
我有一个SelectMultipleField,它在运行时使用JavaScript进行填充/修改。我的问题是,这违反了验证程序,因此对form.validate_on_submit()始终的调用失败。
SelectMultipleField('Test', coerce=int)
Run Code Online (Sandbox Code Playgroud)
我已经尝试设置不执行任何操作的自定义验证器:
def dummy_validator(form, field):
print("check: "+str(field.data))
SelectMultipleField('Test', coerce=int, [dummy_validator])
Run Code Online (Sandbox Code Playgroud)
但是,这仍然失败。例如,我收到错误消息'7' is not a valid choice for this field。
使SelectMultipleField通过启动的验证过程需要什么form.validate_on_submit()?
例外是AttributeError: 'StringField' object has no attribute 'wrap_formdata',它似乎只发生在我从 Flask-Admin 仪表板创建或编辑以下两个模型中的任何一个时:
class Experiment(db.Model):
id = db.Column(db.Integer, primary_key=True)
property_id = db.Column(db.Integer,
db.ForeignKey('property.id'),
index=True,
nullable=False)
name = db.Column(db.String, nullable=False)
start_date = db.Column(db.DateTime, nullable=True)
end_date = db.Column(db.DateTime, nullable=True)
status = db.Column(db.String, nullable=False, default='Draft')
title = db.Column(db.String)
meta = db.Column(db.String)
seed_uri = db.Column(db.String)
targets = db.Column(postgresql.JSON)
variations_json = db.Column(postgresql.JSON)
variations = db.relationship('ExperimentVariation',
backref='experiment',
cascade='save-update, merge, delete')
def __repr__(self):
repr_fmt = '<Experiment {id}, {property_id} {name}>'
return repr_fmt.format(id=self.id,
property_id=self.property_id,
name=self.name)
class ExperimentVariation(db.Model):
id = db.Column(db.Integer, primary_key=True) …Run Code Online (Sandbox Code Playgroud) sqlalchemy wtforms flask-sqlalchemy flask-wtforms flask-admin
我想用此查询返回的行填充WTForms SelectField:
cur.execute("SELECT length FROM skipakke_alpin_ski WHERE stock > 0")
Run Code Online (Sandbox Code Playgroud)
该查询返回具有不同类型滑雪板的滑雪板长度的行。cur.fetchall()返回以下元组:
[(70,), (75,), (82,), (88,), (105,), (115,), (125,), (132,), (140,), (150,), (160,), (170,)]
Run Code Online (Sandbox Code Playgroud)
我将如何将这些数字添加到中SelectField,以便每个滑雪板长度成为其自己的可选选择?如果我手动完成此操作,则将执行以下操作:
ski_size = SelectField('Ski size', choices=['70', '70', '75', '75'])
Run Code Online (Sandbox Code Playgroud)
...对于所有不同的长度,依此类推。
我正在flask中创建一个联系表单,我想在jinja2中使用html占位符,如何在jinja 2中使用html占位符?
<form action="{{ url_for('contact_page') }}" class="col-md-6 mx-auto my-auto mt-3" method="POST">
{{ form.hidden_tag() }}
<p class="text-left">{{ form.name.label() }}</p>
{{ form.name(class="form-control mb-2") }}
<p class="text-left">{{ form.email.label() }}</p>
{{ form.email(class="form-control mb-2") }}
<p class="text-left">{{ form.subject.label() }}</p>
{{ form.subject(class="form-control mb-2") }}
<p class="text-left">{{ form.message.label() }}</p>
{{ form.message(class="form-control mb-3") }}
<div class="form-group">
{{ form.submit(class="btn btn-primary btn-round mt-4 ") }}
</div>
</form>
Run Code Online (Sandbox Code Playgroud) 我正在使用烧瓶应用程序并使用wtforms:
class RegisterForm(Form):
username = StringField('Username', validators=[DataRequired(), Length(min=3, max=25)])
email = StringField('Email', validators=[DataRequired(), Email(), Length(min=6, max=40)])
phone = StringField('Phone', validators=[DataRequired(), Length(10)])
Run Code Online (Sandbox Code Playgroud)
我刚刚添加了手机,正在寻找验证美国号码的方法.我遇到了http://wtforms-components.readthedocs.org/en/stable/#phonenumberfield,但这似乎不再有phonenumberfield了.什么是使用wtfforms处理此问题的最佳方法?
编辑课程:
class RegisterForm(Form):
username = StringField('Username', validators=[DataRequired(), Length(min=3, max=25)])
email = StringField('Email', validators=[DataRequired(), Email(), Length(min=6, max=40)])
phone = StringField('Phone', validators=[DataRequired(),validate_phone('RegisterForm','phone'), Length(min=6, max=40)])
def validate_phone(form, field):
if len(field.data) > 16:
raise ValidationError('Invalid phone number.')
try:
input_number = phonenumbers.parse(field.data)
if not (phonenumbers.is_valid_number(input_number)):
raise ValidationError('Invalid phone number.')
except:
input_number = phonenumbers.parse("+1"+field.data)
if not (phonenumbers.is_valid_number(input_number)):
raise ValidationError('Invalid phone number.')
Run Code Online (Sandbox Code Playgroud) wtforms ×11
flask ×8
python ×7
sqlalchemy ×2
flask-admin ×1
html ×1
jinja2 ×1
mysql ×1
python-3.x ×1
sqlite ×1
tornado ×1
validation ×1