没有属性 validate_on_submit:如何在烧瓶处理程序/视图中使用 wtforms-alchemy 的 ModelForm
has no attribute validate_on_submit: How to use wtforms-alchemy's ModelForm in a flask handler / view
我正在尝试将 from wtforms.ext.sqlalchemy.orm import model_form
切换为使用 wtforms_alchemy ModelForm:
from wtforms_alchemy import ModelForm
我失败得很惨......而且我一直没有成功搜索使用 wtforms_alchemy 的工作示例,它显示了处理程序和模型。
使用 model_form 对我有用:这是我使用模型表单的工作代码:
模型脚本(python):
from app import db
class Test(db.Model):
id = db.Column(db.Integer, primary_key=True)
test1 = db.Column(db.String())
test2 = db.Column(db.String())
处理程序脚本(python,flask,model_form):
from flask.ext.wtf import Form
from wtforms.ext.sqlalchemy.orm import model_form
from wtforms import validators
from app import app
from app import db
from app.models import *
@app.route('/', methods=['GET', 'POST'])
@login_required
def index():
TestForm = model_form(Test, base_class = Form, db_session=db.session, field_args = {
'test1' : {
'validators' : [validators.Length(max=1)]
}
})
form = TestForm()
if form.validate_on_submit():
flash("success")
new_test = Test()
form.populate_obj(new_test)
db.session.add(new_test)
db.session.commit()
return redirect(url_for("index"))
return render_template("main.html", form=form)
模板(使用mako):
<form class="form" action="/" method="POST">
% for f in form:
%if f.widget.input_type != 'hidden':
<dt>${ f.label }</dt>
% endif
<dd>
${f}
% if f.errors:
<div class="flashes alert alert-danger">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
% for e in f.errors:
<p>${e}</p>
% endfor
</div>
% endif
</dd>
% endfor
<input type="submit" value="go">
</form>
当我尝试将我的处理程序脚本页面更改为使用带有此代码的 ModelForm(如下)时,我得到一个 'TestForm' 对象没有属性 'validate_on_submit'错误
处理程序脚本(python、flask、ModelForm):
from flask.ext.wtf import Form
from wtforms_alchemy import ModelForm
from wtforms import validators
from app import app
from app import db
from app.models import *
class TestForm(ModelForm):
class Meta:
model = Test
@app.route('/', methods=['GET', 'POST'])
@login_required
def index():
form = TestForm()
if form.validate_on_submit():
flash("success")
new_test = Test()
form.populate_obj(new_test)
db.session.add(new_test)
db.session.commit()
return redirect(url_for("index"))
return render_template("main.html", form=form)
我错过了什么?
没关系。
尽管我曾尝试使用
from wtforms_alchemy import model_form_factory
在此之前 post,当我把它放回去时它决定工作,但在 ModelForm 导入之后而不是之前。
随便。
更改导入 --> “从 wtforms_sqlalchemy.orm 导入 model_form”
更改导入 --> " from flask_wtf import FlaskForm "
将基数 class 从 'Form' 更改为 'FlaskForm'
我正在尝试将 from wtforms.ext.sqlalchemy.orm import model_form
切换为使用 wtforms_alchemy ModelForm:
from wtforms_alchemy import ModelForm
我失败得很惨......而且我一直没有成功搜索使用 wtforms_alchemy 的工作示例,它显示了处理程序和模型。
使用 model_form 对我有用:这是我使用模型表单的工作代码:
模型脚本(python):
from app import db
class Test(db.Model):
id = db.Column(db.Integer, primary_key=True)
test1 = db.Column(db.String())
test2 = db.Column(db.String())
处理程序脚本(python,flask,model_form):
from flask.ext.wtf import Form
from wtforms.ext.sqlalchemy.orm import model_form
from wtforms import validators
from app import app
from app import db
from app.models import *
@app.route('/', methods=['GET', 'POST'])
@login_required
def index():
TestForm = model_form(Test, base_class = Form, db_session=db.session, field_args = {
'test1' : {
'validators' : [validators.Length(max=1)]
}
})
form = TestForm()
if form.validate_on_submit():
flash("success")
new_test = Test()
form.populate_obj(new_test)
db.session.add(new_test)
db.session.commit()
return redirect(url_for("index"))
return render_template("main.html", form=form)
模板(使用mako):
<form class="form" action="/" method="POST">
% for f in form:
%if f.widget.input_type != 'hidden':
<dt>${ f.label }</dt>
% endif
<dd>
${f}
% if f.errors:
<div class="flashes alert alert-danger">
<a href="#" class="close" data-dismiss="alert" aria-label="close">×</a>
% for e in f.errors:
<p>${e}</p>
% endfor
</div>
% endif
</dd>
% endfor
<input type="submit" value="go">
</form>
当我尝试将我的处理程序脚本页面更改为使用带有此代码的 ModelForm(如下)时,我得到一个 'TestForm' 对象没有属性 'validate_on_submit'错误
处理程序脚本(python、flask、ModelForm):
from flask.ext.wtf import Form
from wtforms_alchemy import ModelForm
from wtforms import validators
from app import app
from app import db
from app.models import *
class TestForm(ModelForm):
class Meta:
model = Test
@app.route('/', methods=['GET', 'POST'])
@login_required
def index():
form = TestForm()
if form.validate_on_submit():
flash("success")
new_test = Test()
form.populate_obj(new_test)
db.session.add(new_test)
db.session.commit()
return redirect(url_for("index"))
return render_template("main.html", form=form)
我错过了什么?
没关系。
尽管我曾尝试使用
from wtforms_alchemy import model_form_factory
在此之前 post,当我把它放回去时它决定工作,但在 ModelForm 导入之后而不是之前。
随便。
更改导入 --> “从 wtforms_sqlalchemy.orm 导入 model_form” 更改导入 --> " from flask_wtf import FlaskForm " 将基数 class 从 'Form' 更改为 'FlaskForm'