使用 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...)
现在一切正常!!
也许有更好的解决方案,但我得到了这个:
- 将原始类型名称存储在隐藏字段中,然后在自定义验证器中进行检查:
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.")
- 在渲染模板之前在视图函数中设置来源类型名称:
form = EditTypeForm()
form.origin_type_name.data = the_origin_data_get_from_database
我有这个表单和这个唯一性验证器:
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...)
现在一切正常!!
也许有更好的解决方案,但我得到了这个:
- 将原始类型名称存储在隐藏字段中,然后在自定义验证器中进行检查:
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.")
- 在渲染模板之前在视图函数中设置来源类型名称:
form = EditTypeForm()
form.origin_type_name.data = the_origin_data_get_from_database