我正在使用 wtforms,我需要创建一个可以根据数据库中的信息生成表单定义的东西;动态表单创建。我逐渐意识到需要做什么,而我才刚刚开始。我可以创建表单并将它们与 wtforms/flask 一起使用,但是根据数据定义表单(从表单到表单略有不同)目前超出了我目前的技能水平。
有没有人做过这个并提供一些意见?有点模糊的问题,还没有实际的代码。我还没有找到任何例子,但也不是不可能做到。
mass of variable data to be used in a form --> wtforms ---> form on webpage
Run Code Online (Sandbox Code Playgroud)
编辑:
因此,“例如”我们可以使用调查。一个调查由几个 SQLAlcehmy 模型组成。调查是具有任意数量关联问题模型的模型(问题属于调查,例如多项选择问题,它变得复杂)。为了简化,让我们使用简单的 json/dict 伪代码:
{survey:"Number One",
questions:{
question:{type:truefalse, field:"Is this true or false"},
question:{type:truefalse, field:"Is this true or false"},
question:{type:text, field:"Place your X here"}
}
}
{survey:"Number Two",
questions:{
question:{type:text, field:"Answer the question"},
question:{type:truefalse, field:"Is this true or false"},
question:{type:text, field:"Place your email address here"}
}
}
Run Code Online (Sandbox Code Playgroud)
想象一下,而不是这个,数百个不同长度的 5+ 字段类型。如何使用 WTForms 为此管理表单,或者我什至需要使用 wtforms?我可以根据需要定义静态表单,但不能动态定义。
顺便说一句,我在 rails 中使用 simpleform …
我正在使用WTForms-JSON并处理嵌套表单。我想让内部表单可选,但如果存在内部表单,我希望它的字段是必需的。我遇到的问题是FormField不接受验证器。
(虽然我使用的是 WTForms-JSON,但我相信这也适用于 vanilla WTForms。)
这段代码有效,但不符合我想要的方式:
class InnerForm(Form):
foo_id = IntegerField("Foo ID", [Required()])
class OuterForm(Form):
inner = FormField(InnerForm)
Run Code Online (Sandbox Code Playgroud)
上面代码的问题inner是隐式需要。奇怪的是,虽然validate()回报率False时inner被省略了,errors是空的。
此代码不起作用:
class InnerForm(Form):
foo_id = IntegerField("Foo ID", [Required()])
class OuterForm(Form):
inner = FormField(InnerForm, "Inner", [Optional()])
Run Code Online (Sandbox Code Playgroud)
后者产生此错误:
TypeError: FormField does not accept any validators. Instead, define them on the enclosed form.
Run Code Online (Sandbox Code Playgroud)
我的问题是:我怎样才能使inner可选,但foo_id如果inner存在则需要?
我正在编写一些基本测试并且测试失败。
def test_new_user_registration(self):
self.client.get('/user/register')
form = RegistrationForm(
email=u'crow@crow.com',
first_name=u'Alex',
last_name=u'Frazer',
username=u'crow',
password=u'fake_password',
confirm_password=u'fake_password'
)
self.assertTrue(form.validate())
Run Code Online (Sandbox Code Playgroud)
断言错误失败form.validate(),但如何查看验证错误是什么?
我正在尝试使用我的模型并使用 wtform 的 model_form for sqlalchemy 生成表单。我希望带有外键约束的字段是该表中所有项目的选择列表。
到目前为止,对于文字外键,我要么什么也得不到,要么得到一个简单的文本输入,我有点迷茫。
好的,所以我这里有一个相对简单的数据模型。为此,我可以将其减少到我拥有的硬件类型及其支持状态。我希望将来能够添加支持状态,并为它们提供更多有用的描述。
from . import db
class Status(db.Model):
"""Support status"""
__tablename__ = 'status'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(64), unique=True)
description = db.Column(db.Text)
def __repr__(self):
return self.name
class Hardware(db.Model):
"""Hardware"""
__tablename__ = 'hardware'
id = db.Column(db.Integer, primary_key = True)
name = db.Column(db.String(64), unique=True)
description = db.Column(db.Text)
status = db.Column(db.Integer, db.ForeignKey('status.id'))
...
def __repr__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
时髦。
现在我的观点是这样的:
from flask import render_template, request, flash, redirect, url_for
from flask_wtf import Form
from …Run Code Online (Sandbox Code Playgroud) 当我使用 WTForms-JSON 时,嵌套表单 (FormFields) 不会填充数据。我无法发现我的错误,请参见下面的示例。
from flask import Flask, request, jsonify
from flask_wtf import Form
from wtforms import TextField, FormField, IntegerField
from wtforms.validators import InputRequired
import wtforms_json
app = Flask(__name__)
app.config["WTF_CSRF_ENABLED"] = False
wtforms_json.init()
class Address(Form):
street = TextField('street', validators=[InputRequired()])
number = IntegerField('number', validators=[InputRequired()])
class User(Form):
name = TextField('name', validators=[InputRequired()])
address = FormField(Address, label='address')
@app.route('/', methods=['POST'])
def why_no_work():
form = User()
form.from_json(request.json)
print form.data
if form.validate():
return jsonify(success='YEAH')
else:
return jsonify(errors=form.errors)
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
我发送以下 JSON 请求
{ …Run Code Online (Sandbox Code Playgroud) 我对 WTForms、Flask-WTF 比较陌生。我无法弄清楚如何从表单定义中简单地将 HTML5 属性“自动聚焦”添加到表单字段之一。我想在 Python 代码中这样做,而不是在 Jinja 模板中。这是我所拥有的:
class NameForm(Form):
name1 = StringField("Nom d'utilisateur :",
validators=[Required(), Length(1, 16)])
pwd1 = PasswordField("Mot de passe :",
validators=[Required(), Length(1, 16)])
mail1 = StringField("Compte GMail du calendrier :",
validators=[Required(), Email()])
submit = SubmitField('Envoyer')
Run Code Online (Sandbox Code Playgroud)
我只想将“autofocus”属性添加到“name1”字段中。
我在路线中试过这个:
@app.route('/', methods=['GET', 'POST'])
def form():
name1 = None
pwd1 = None
mail1 = None
msg = None
# Tests
Name_Form_kwargs = {"name1": "" ,"autofocus" :"true"}
Name_Form = NameForm(**Name_Form_kwargs)
print Name_Form.name1
#
form = NameForm()
.....
Run Code Online (Sandbox Code Playgroud)
但这只会更改字段值,不会添加任何属性:
<input id="name1" …Run Code Online (Sandbox Code Playgroud) 我有一个有位置的用户。就像概念证明一样,位置是应存储为用户模型的 CombinedForm 中的 FormField。最终我想要有相当多的嵌套表单,所以我真的很喜欢 form.populate_obj(Model) 来处理数据。但是,我一定是做错了什么。这是我的代码:
# - - - Models - - -
class User(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer(), primary_key=True)
username = db.Column(db.String(40))
location = db.relationship('Location', backref='user')
class Location(db.Model):
__tablename__ = 'locations'
id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
descr = db.Column(db.String(50))
# - - - Forms - - -
class LocationForm(NoCsrfForm):
descr = StringField('Location Name')
class CombinedForm(Form):
username = StringField('User', validators=[DataRequired()])
location = FormField(LocationForm) # , default=lambda: Location())
submit = SubmitField('Submit')
# - - - …Run Code Online (Sandbox Code Playgroud) 在 select2 操作下拉字段后,定期使用form.owner_id.datayields None。如何从 select2 字段中提取选定的选项。
如果我禁用 select2 javascript,wtforms 将正常工作,我将能够使用form.owner_id.data. (但看起来很丑)
class ProjectForm(FlaskForm):
owner_id = SelectField('Owner:', [validators.Required()], choices=[], render_kw={"placeholder": "Owner company *"})
Run Code Online (Sandbox Code Playgroud)
(为简单起见,其余形式已被截断)
@app.route('/new_project/<int:company_id>', methods=('GET', 'POST'))
def new_project(company_id):
membership = Membership.query.filter_by(user_id=current_user.id, company_id=company_id).first()
company = Company.query.filter_by(id=company_id).first_or_404()
form = ProjectForm()
form.owner_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]
form.client_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]
form.contractor_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]
form.membership_id.choices = [(str(comp.id), repr(comp)) for comp in Company.query.all()]
if request.method …Run Code Online (Sandbox Code Playgroud) 基于两个或多个条目验证 WTform 的最佳方法是什么?即在下面的表格中,我想验证数据库中不存在具有提供的名称和地址的公司。
class CompanyForm(FlaskForm):
name=StringField('Company Name', validators=[DataRequired()])
address=StringField('Street Address', validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud)
像这样的东西...
def validate_name(self, name, address):
company = Company.query.filter_by(name=name.data, address=address.data).first()
if company is None:
raise ValidationError('This company already exists in our database.')
Run Code Online (Sandbox Code Playgroud)
我通读了关于 SO 的文档和类似的问题,但我仍然无法弄清楚。
class AddProductForm(FlaskForm):
product_pictures = MultipleFileField('Pictures')
submit = SubmitField('Add Pictures')
def product_add_pics():
form = AddProductForm()
if form.validate_on_submit():
if form.product_pictures.data:
for picture_upload in form.product_pictures.data:
print(type(picture_upload))
Run Code Online (Sandbox Code Playgroud)
形式:
<div class="form-group">
{{ form.product_pictures.label() }}
{{ form.product_pictures(class="form-control-file") }}
{% if form.product_pictures.errors %}
{% for error in form.product_pictures.errors %}
<span class="text-danger">{{ error }}</span>
{% endfor %}
{% endif %}
</div>
Run Code Online (Sandbox Code Playgroud)
我总是将类型作为字符串。我怎样才能得到二进制文件?我使用 wtforms 中的 MultipleFileField。
wtforms ×10
python ×8
flask ×5
wtforms-json ×2
formfield ×1
forms ×1
javascript ×1
python-2.7 ×1
sqlalchemy ×1
testing ×1
unit-testing ×1
validation ×1