我正在尝试使用我的模型并使用 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) 我正在关注本教程http://flask.pocoo.org/docs/0.10/patterns/wtforms/
这是一个带有宏的 _formhelpers.html 模板示例:
{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)
这里的 register.html 模板利用了 _formhelpers.html 模板:
{% from "_formhelpers.html" import render_field %}
<form method=post action="/register">
<dl>
{{ render_field(form.username) }}
{{ render_field(form.email) }}
{{ render_field(form.password) }}
{{ render_field(form.confirm) }}
{{ render_field(form.accept_tos) }}
</dl>
<p><input type=submit value=Register>
</form>
Run Code Online (Sandbox Code Playgroud)
它最终生成了一个序列:
<dt><label for="email">Email Address</label> …Run Code Online (Sandbox Code Playgroud) 我正在使用 Flask 和 WTForms 组合一个表单,但是,当涉及到下拉列表时,我希望每个下拉列表都有一个“请选择”选项,根据选定的原因验证需要为假,例如一个值尚未被选中。
我是否需要使用正则表达式验证或自定义验证来实现这一点?如果我确实需要自定义验证,那么我该如何构建一个?
CAR_MAKES = [('-1', "Please select a vehicle make..."), (1, 'Honda'),
(2, 'Ford'), (3, 'BMW')]
dd_car_makes = SelectField('dd_car_makes', choices=CAR_MAKES,
validators=[DataRequired()])
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
class Company(enum.Enum):
EnterMedia = 'EnterMedia'
WhalesMedia = 'WhalesMedia'
@classmethod
def choices(cls):
return [(choice.name, choice.name) for choice in cls]
@classmethod
def coerce(cls, item):
print "Coerce", item, type(item)
if item == 'WhalesMedia':
return Company.WhalesMedia
elif item == 'EnterMedia':
return Company.EnterMedia
else:
raise ValueError
Run Code Online (Sandbox Code Playgroud)
这是我的 wtform 字段:
company = SelectField("Company", choices=Company.choices(), coerce=Company.coerce)
Run Code Online (Sandbox Code Playgroud)
这是在我的表单中生成的 html:
<select class="" id="company" name="company" with_label="">
<option value="EnterMedia">EnterMedia</option>
<option value="WhalesMedia">WhalesMedia</option>
</select>
Run Code Online (Sandbox Code Playgroud)
不知何故,当我点击提交时,我不断收到“不是一个有效的选择”。
这是我的终端输出:
当我查看我的终端时,我看到以下内容:
Coerce None <type 'NoneType'>
Coerce EnterMedia <type 'unicode'>
Coerce EnterMedia <type 'str'>
Coerce WhalesMedia …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Flask-WTF 用于我添加到我最近继承的 Flask 应用程序的新表单。我对 Flask 生态系统相当陌生(对 WTForms 完全陌生),四年来我没有做过任何 Web 开发。
Flask-WTF 文档中的示例代码在表单验证失败时呈现页面,而不是重定向(Post/Redirect/Get)。此时,浏览器刷新将重新提交之前的 POST。这不好,对吧?虽然大多数人似乎没有对这种情况给予任何关注,但我确实看到一些人认为这是需要避免的(例如这里和这里)。
那么在使用 Flask-WTF 时如何避免这个问题呢?如果我在验证失败时重定向,我想我将失去在每个字段上显示验证错误的能力。或者也许我不应该担心这种情况?
在 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 的文档和类似的问题,但我仍然无法弄清楚。
wtforms ×10
python ×8
flask ×7
enums ×1
formfield ×1
javascript ×1
jinja2 ×1
python-2.7 ×1
sqlalchemy ×1
validation ×1
wtforms-json ×1