我已经使用 wtforms 创建了一个注册表单。我在其中使用 FormField 以便我不必再次重复表单的某些元素。但是每当我点击提交按钮时,它总是在 validate_on_submit 方法调用时给我错误。不明白为什么会这样。
我form.py的如下:
class ProfileInfoForm(Form):
firstname = TextField('firstname', validators=
[validators.Required("Please enter First name.")])
lastname = TextField('lastname', validators=
[validators.Required("Please enter Last name.")])
email = EmailField('email', validators=
[validators.Required("Please enter your valid email.")])
gender = RadioField('gender', validators=
[validators.Required("Please select gender")],
choices=[('female', 'Female'), ('male', 'Male')])
dob = TextField('dob', validators=
[validators.Required("Please select date of birth.")])
languages = SelectMultipleField('languages', choices=[('', '')],
validators=
[validators.Required("Please select\
atleast one \
language.")])
class RegistrationForm(Form):
profilefield = FormField(ProfileInfoForm)
password = PasswordField('password',
validators=
[validators.Required("Please enter …Run Code Online (Sandbox Code Playgroud) 我有一个简单的无线电字段,它总是导致validate_on_submit返回false.当我打印form.errors时,看起来"无效的选择"作为无线电字段中的值传递,尽管coerce = int.
我不认为我正在破坏表格中返回的任何东西,我希望以正确的方式创造动态选择.我不明白为什么会失败.
以下是我的项目的相关部分 - 任何建议表示赞赏.
forms.py:
class SelectRecord(Form):
rid = RadioField("Record Select", choices=[], coerce=int,validators=[InputRequired()])
Run Code Online (Sandbox Code Playgroud)
views.py:
@mod.route('/select/', methods=('GET', 'POST'))
@login_required
def select_view():
form = SelectRecord(request.form)
if form.validate_on_submit():
rid = form.data.rid
if form['btn'] == "checkout":
# check out the requested record
Records.checkoutRecord(rid)
return render_template('/records/edit.html',rid=rid)
elif form['btn'] == "checkin":
Records.checkinRecord(rid)
flash("Record checked in.")
else:
mychoices = []
recs_co = session.query(Records.id).filter(Records.editing_uid == current_user.id). \
filter(Records.locked == True)
for x in recs_co:
mychoices.append((x.rid,"%s: %s (%s)" % (x.a, x.b, x.c, x.d)))
x = getNextRecord() …Run Code Online (Sandbox Code Playgroud) 我使用了http://flask.pocoo.org/snippets/60/中的代码片段,通过Flask中的模型创建了WTForms表单。除了仅创建输入字段的事实以外,其他所有方法都工作正常。我希望说明(请参见下面的models.py)成为文本区域。有任何想法吗?
从models.py:
title = db.Column(db.String(55))
description = db.Column(db.Text)
Run Code Online (Sandbox Code Playgroud)
从views.py
MyForm = model_form(MyModel, base_class=Form)
form = MyForm()
return render_template('create.html', form=form)
Run Code Online (Sandbox Code Playgroud)
来自create.html
{% for field in form %}
{{field.label}}
{{field}}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
输出:
<input id="title" name="title" type="text" value="">
<input id="description" name="description" type="text" value="">
Run Code Online (Sandbox Code Playgroud)
我想要的是:
<input id="title" name="title" type="text" value="">
<textarea id="description" name="description"></textarea>
Run Code Online (Sandbox Code Playgroud) 在我的表单上,我有两个按钮用于提交表单。一个按钮删除选定的文件(显示在表格中,一个复选框用于对象),另一个按钮选择它们进行处理。
当文件在删除时被选择时,不需要验证(除了检查是否至少选择了一个文件)。但是,为了进行处理,我需要确保只有一个具有特定扩展名的文件。基本上,我需要根据用户单击的按钮进行不同的验证过程。
我怎样才能最好地做到这一点?我知道我可以在视图中执行验证,但我更喜欢在表单内验证它,因为它更干净。
这是有问题的表格:
class ButtonWidget(object):
"""A widget to conveniently display buttons.
"""
def __call__(self, field, **kwargs):
if field.name is not None:
kwargs.setdefault('name', field.name)
if field.value is not None:
kwargs.setdefault('value', field.value)
kwargs.setdefault('type', "submit")
return HTMLString('<button %s>%s</button>' % (
html_params(**kwargs),
escape(field._value())
))
class ButtonField(Field):
"""A field to conveniently use buttons in flask forms.
"""
widget = ButtonWidget()
def __init__(self, text=None, name=None, value=None, **kwargs):
super(ButtonField, self).__init__(**kwargs)
self.text = text
self.value = value
if name is not None:
self.name = name
def …Run Code Online (Sandbox Code Playgroud) 我想使用Jquery添加或删除带有按钮的新WTForm输入字段,就像这里 http://www.sanwebe.com/2013/03/addremove-input-fields-dynamically-with-jquery/comment-page-1 但是使用我的表格字段.
我的表格:
class EditBook(Form):
title = TextField('title', validators = [Required()])
authors = FieldList(TextField())
Run Code Online (Sandbox Code Playgroud)
问题是我不能只是附加例子
$(InputsWrapper).append("{{form.authors(size=20)}}");
Run Code Online (Sandbox Code Playgroud)
它只是打印这个文本.
我有一个Prediction模型列表.我想将它们绑定到表单并允许使用回发.我如何构建我的表单,以便帖子将Home/Away得分与我绑定到表单的每个项目的Prediction模型id字段相关联?
视图
@app.route('/predictor/',methods=['GET','POST'])
@login_required
def predictions():
user_id = g.user.id
prediction= # retrieve prediction
if request.method == 'POST':
if form.validate() == False:
flash('A score is missing, please fill in all predictions')
render_template('predictor.html', prediction=prediction, form=form)
else:
for pred in prediction:
# store my prediction
flash('Prediction added')
return redirect(url_for("predictions"))
# display current predictions
elif request.method == 'GET':
return render_template('predictor.html', prediction=prediction, form=form)
Run Code Online (Sandbox Code Playgroud)
形成
class PredictionForm(WTForm):
id = fields.IntegerField(validators=[validators.required()], widget=HiddenInput())
home_score = fields.TextField(validators=[validators.required()])
away_score = fields.TextField(validators=[validators.required()])
Run Code Online (Sandbox Code Playgroud)
模板
<form action="" …Run Code Online (Sandbox Code Playgroud) 我有一个从数据库表填充的 SelectField。我将选项加载到表单中,如下所示:
@statuses.route('/new', methods=['GET', 'POST'])
@login_required
def new_status():
form = StatusForm()
form.status_cd.choices = [(a.id, a.status_cd) for a in \
Status_Code.query.order_by('status_cd')]
if form.validate_on_submit():
status = Status(author=current_user)
form.to_model(status)
db.session.add(status)
db.session.commit()
flash('The status was added successfully.')
return redirect(url_for('.index'))
return render_template('statuses/new_status.html', form=form)
Run Code Online (Sandbox Code Playgroud)
查询中引用的模型如下:
class Status_Code(db.Model):
__tablename__ = 'status_cd'
id = db.Column(db.Integer, primary_key=True)
status_cd = db.Column(db.String(16), nullable=False)
status_detail = db.Column(db.Text)
is_option_active = db.Boolean()
date_created = db.Column(db.DateTime, default=db.func.now())
Run Code Online (Sandbox Code Playgroud)
表单类如下:
class StatusForm(Form):
datetime = DateTimeField('Date / Time')
name = StringField('Name', validators=[Required()])
status_cd = SelectField('Status Code', coerce=int)
status_detail …Run Code Online (Sandbox Code Playgroud) 我如何添加此烧瓶代码所需的标签:
{{ form.youtube_href(type='url', class='form-control') }}
Run Code Online (Sandbox Code Playgroud)
实际输出是:
<input class="form-control" id="youtube_href" name="youtube_href" value="" type="url">
Run Code Online (Sandbox Code Playgroud)
需要这个输出棒给出错误:
<input class="form-control" id="youtube_href" name="youtube_href" value="" type="url" required>
Run Code Online (Sandbox Code Playgroud)
我试过这个蝙蝠给出错误:
{{form.youtube_href(type ='url',class ='form-control','required')}}
我打算在我的烧瓶应用程序中将两个表单放在一个页面中,一个用于编辑一般用户信息,另一个用于重置密码.模板看起来像这样
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block page_content %}
<div class="page-header">
<h1>Edit Profile</h1>
</div>
{{ wtf.quick_form(form_profile, form_type='horizontal') }}
<hr>
{{ wtf.quick_form(form_reset, form_type='horizontal') }}
<hr>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
每个表单都有一个提交按钮.
在路由功能中,我试图将这两个表单分开
form_profile = ProfileForm()
form_reset = ResetForm()
if form_profile.validate_on_submit() and form_profile.submit.data:
....
if form_reset.validate_on_submit() and form_reset.submit.data:
.....
Run Code Online (Sandbox Code Playgroud)
但它没有用.当我单击ResetForm中的按钮时,将执行ProfileForm验证逻辑.
我怀疑问题是wtf.quick_form()创建两个相同的提交按钮,但不确定.
在这种情况下我该怎么办?bootstrap/wtf.html模板可以处理这种情况吗?
我正在获取ImportError:没有模块名为flask_wtf的错误,我尝试了每一个可能的解决方案。我使用flask / bin / pip安装flask- wrf 安装flask-wtf:
已满足要求:./ flask / lib / python2.7 / site-packages中的flask-wtf已满足要求:./ flask / lib / python2.7 / site-packages中的WTForms。请帮我解决这个问题。
我正在共享显示错误的代码:
from flask_wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired
class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)***
Run Code Online (Sandbox Code Playgroud)