Flask 表单验证在更新时不起作用

问题描述 投票:0回答:1

我有一个烧瓶形式,它与具有唯一约束的模型相关联。我的创建表单/验证按预期工作,如果名称与数据库中已有的名称冲突,则会向用户显示错误。但是,当我尝试执行相同的操作来验证更新操作时(其中名称可能会重新提交,并且如果它与之前的值匹配,则允许通过,但如果与另一个记录冲突则抛出错误)。我不知道如何让它做到这一点。

这是正确工作的表格:

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'))

如果更新的值与预先存在的记录匹配,但如果它与之前的记录本身匹配,则不会向用户显示错误。

flask flask-sqlalchemy flask-wtforms
1个回答
0
投票

我想我现在可以工作了,至少我的测试用例通过了。 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')
© www.soinside.com 2019 - 2024. All rights reserved.