我有一个烧瓶形式,它与具有唯一约束的模型相关联。我的创建表单/验证按预期工作,如果名称与数据库中已有的名称冲突,则会向用户显示错误。但是,当我尝试执行相同的操作来验证更新操作时(其中名称可能会重新提交,并且如果它与之前的值匹配,则允许通过,但如果与另一个记录冲突则抛出错误)。我不知道如何让它做到这一点。
这是正确工作的表格:
class GearCategoryForm(FlaskForm):
name = StringField('Category Name:', validators=[InputRequired()])
desc = StringField('Category Description:')
submit = SubmitField('Create Category')
def validate_name(self, name):
category = GearCategories.query.filter_by(name=self.name.data.capitalize()).first()
if category is not None:
raise ValidationError('Category already exists')
这是我无法工作的:
class UpdateGearCategoryForm(FlaskForm):
name = StringField('Category Name:', validators=[InputRequired()])
desc = StringField('Category Description:')
submit = SubmitField('Update Category')
def validate_name(self, name):
category = GearCategories.query.filter_by(name=self.name.data.capitalize()).first()
#flash(f"{category} --- {name.data}") --- debugging attempts
if category is not None and category.name != name.data:
raise ValidationError('Category already exists')
这是来自不起作用的表单的路线:
@admin_gear_bp.route('/admin/gear/category/<id>/update', methods=['GET', 'POST'])
@login_required
def update_category(id):
if not current_user.is_anonymous:
if current_user.is_admin:
try:
category = GearCategories.query.get_or_404(id)
except SQLAlchemyError as error:
return render_template('errors/500.html', title='Internal Error'), 500
form = UpdateGearCategoryForm()
if form.validate_on_submit():
category.name = form.name.data.capitalize()
category.description = form.desc.data.capitalize()
db.session.commit()
flash('Successfully updated category {}'.format(category.name))
return redirect(url_for('admin_gear.categories_admin'))
form.name.data = category.name
form.desc.data = category.description
return render_template('admin/gear/add_category.html', title='Update Category', form=form,
legend='Update Category'), 200
else:
return render_template('errors/401.html', title='Unauthorized'), 401
else:
flash('You must login to update gear categories.')
return redirect(url_for('users.login'))
如果更新的值与预先存在的记录匹配,但如果它与之前的记录本身匹配,则不会向用户显示错误。
我想我现在可以工作了,至少我的测试用例通过了。 FWIW,下面是更新后的“更新”表单,其中验证按预期进行。
class UpdateGearCategoryForm(FlaskForm):
name = StringField('Category Name:', validators=[InputRequired()])
desc = StringField('Category Description:')
submit = SubmitField('Update Category')
def validate_name(self, name):
category = GearCategories.query.filter_by(name=self.name.data.capitalize()).first()
if category is not None:
if name.data != category.name.capitalize():
raise ValidationError('Category already exists')