我有以下课程:
class Cloaker(db.Model):
id = db.Column(db.Integer, primary_key=True)
domain = db.Column(db.String(32), unique=True, nullable=False, info={
'description': 'Raw Domain Only (no www). i.e. hello.com',
'validators': raw_domain_validator,
})
(请注意 unique = True for domain)
使用WTForm生成的表单:
class CloakerForm(ModelForm):
class Meta:
model = Cloaker
我有以下代码处理此模型的CRUD:
@cloaker_bp.route('/new/', methods=['GET', 'POST'])
@cloaker_bp.route('/<cloaker_id>/', methods=['GET', 'POST'])
def cloaker(cloaker_id=None):
cloaker = Cloaker.query.get(cloaker_id) if cloaker_id else Cloaker()
if request.method == 'GET':
form = CloakerForm(obj=cloaker)
form.populate_obj(cloaker)
else:
form = CloakerForm(request.form)
if form.validate():
form.populate_obj(cloaker)
db.session.add(cloaker)
db.session.commit()
return redirect(url_for('.list_cloakers'))
return render_template('cloaker/single.html', form=form, cloaker=cloaker)
当我更新对象时,我一直在获取域名Already exists.
。
当我在wtforms-alchemy的网站上关注在现有对象中使用唯一验证器时:
...(from the CRUD view)...
else:
form = CloakerForm(obj=cloaker)
#form = CloakerForm(request.form)
form.populate_obj(cloaker)
if form.validate():
db.session.add(cloaker)
db.session.commit()
我的域名获得This field is required.
。如果我按照他们的建议,我不明白WTForms-Alchemy如何从request.form获取他们的数据。
答案 0 :(得分:0)
在POST / UPDATE上也存在“已存在”问题。但doc's solution在我的案例中确实有所帮助:
obj = MyModel.query.get(1)
form = MyForm(obj=obj)
form.populate_obj(obj)
form.validate()
谢谢,因为这个问题帮助我找到了文档中的部分。
答案 1 :(得分:0)
使用 WTForms-Alchemy 0.17.0 版,我发现如果我这样做
record = MyModel.query.filter(MyModel.id = <some valid number>).one()
然后当request.method == 'POST'
my_form = MyModelForm(request.form, obj=record)
同时提供 request.form
和 obj
参数可解决唯一验证器并绕过必填字段,但仍允许更新。