使用 WTForms 自定义验证器编辑现有数据库字段时检查重复项

Check duplication when edit an exist database field with WTForms custom validator

我有这个表单和这个唯一性验证器:

class CreateTypeForm(FlaskForm):
    type_name = StringField("Type", validators=[DataRequired()])
    description = TextAreaField("Description")
    submit = SubmitField("Create")

    def validate_type_name(self, type_name):
        typeName = mongo.db.types.find_one({"type_name": type_name.data})
        if typeName:
            raise ValidationError("The type already exists.")

但是在编辑我的 type:

时需要更改表单的验证器
class EditTypeForm(FlaskForm):
    type_name = StringField("Type", validators=[DataRequired()])
    description = TextAreaField("Description")
    submit = SubmitField("Update")

所以它会检查重复项,但允许我保留当前的 ​​type_name 如果我只编辑描述而不编辑名称。 有什么方法可以做到这一点?

简而言之,如何在检查类型名称重复的同时还允许保存原始类型名称?

更新:

根据以下答案的温和建议,我现在的表格是:

class EditTypeForm(FlaskForm):
    origin_type_name = HiddenField()
    type_name = StringField("Type", validators=[DataRequired()])
    description = TextAreaField("Description")
    submit = SubmitField("Update")

    def validate_type_name(self, type_name):
        typeName = mongo.db.types.find_one({"type_name": type_name.data})
        if typeName and type_name.data != self.origin_type_name.data:
            raise ValidationError("The type already exists.")

并且在路线中:

@app.route("/type/edit/<id>", methods=["POST", "GET"])
@login_required
def edit_type(id):
    form = EditTypeForm()
    query = mongo.db.types.find_one(
        {"_id": ObjectId(id)}, {"_id": 0, "type_name": 1}
    )
    current_type_name = query['type_name']
    form.origin_type_name.data = current_type_name
    (etc...)

现在一切正常!!

也许有更好的解决方案,但我得到了这个:

  1. 将原始类型名称存储在隐藏字段中,然后在自定义验证器中进行检查:
class EditTypeForm(FlaskForm):
    origin_type_name = HiddenField()  # import HiddenField first
    type_name = StringField("Type", validators=[DataRequired()])
    description = TextAreaField("Description")
    submit = SubmitField("Create")

    def validate_type_name(self, type_name):
        typeName = mongo.db.types.find_one({"type_name": type_name.data})
        if typeName and type_name.data != self.origin_type_name.data:
            raise ValidationError("The type already exists.")
  1. 在渲染模板之前在视图函数中设置来源类型名称:
form = EditTypeForm()
form.origin_type_name.data = the_origin_data_get_from_database