我正在编写很多样板代码,以尝试保留表单数据。在其他语言中,保存之前我不必手动将form属性映射到模型,我想知道python / flask是否具有类似的方法?理想情况下,我更希望手动映射所有表单字段以简单地保留数据库记录。
[编辑]
需要明确的是,这种方法对我来说很好,记录可以正确保存,但是效率似乎很低。在另一段代码中,我能够使用wtf库{{ wtf.quick_form(form) }}
创建一个html表单而不显式列出其所有字段的表单。鉴于我的模型属性名称与表单属性的名称相同,我想知道是否可以这样做?
[编辑]
任何反馈
下面的例子。
我有一个比较大的型号“产品”
class Product(db.Model):
field1 = db.Column(db.String(200))
field2 = db.Column(db.String(200))
....
field30 = db.Column(db.String(200))
以烧瓶形式表示,例如
class ProductForm(FlaskForm):
field1 = StringField('Field 1', validators=[DataRequired()])
field2 = TextAreaField('Field 2 Label')
field30 = TextAreaField('Field 30 Label')
submit = SubmitField('Submit')
我在这里尝试映射并保留产品记录...
def save_product(self, product, form):
product.field1 = form.field.data
#lots more tedious form to model mapping
db.session.add(product)
# commit the data to the database
db.session.commit()
在我的route.py中,我有以下内容。我看到它被调用,并且记录确实存在。
def crud():
form = CrudForm()
if form.validate_on_submit():
product = Product()
product.save_product(product, form, new=True)
flash(_('Product Saved'))
return redirect(url_for('main.index'))
return render_template('crud.html', title=_('Product CRUD'),
form=form)
答案 0 :(得分:0)
鉴于表单字段的名称与数据库列的名称相同,因此可以简化模板。表单中所有字段的字典都可以作为form.data属性访问,并且在创建模型的新实例时可以直接将其作为关键字参数传递,而不是随后一次设置它们。
product = Product(**form.data)