Python 使用WTForms自定义验证程序编辑现有数据库字段时检查重复
我将此表单与此验证器一起使用,以确保唯一性:Python 使用WTForms自定义验证程序编辑现有数据库字段时检查重复,python,mongodb,flask,flask-wtforms,Python,Mongodb,Flask,Flask Wtforms,我将此表单与此验证器一起使用,以确保唯一性: class CreateTypeForm(FlaskForm): type_name = StringField("Type", validators=[DataRequired()]) description = TextAreaField("Description") submit = SubmitField("Create") def validate_type_name(self, type_name):
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.")
但是当我编辑我的类型时,需要更改表单的验证器:
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...)
@app.route(“/type/edit/”,方法=[“POST”,“GET”])
@需要登录
def编辑类型(id):
form=EditTypeForm()
query=mongo.db.types.find\u one(
{“\u id”:ObjectId(id)},{“\u id”:0,“键入\u名称”:1}
)
当前类型名称=查询['type\u name']
form.origin\u type\u name.data=当前\u type\u name
(等等……)
这是现在完美的工作 也许有更好的解决方案,但我有一个:
将源类型名称存储在隐藏字段中,然后在自定义验证器中进行检查:
在呈现模板之前,在视图函数中设置原点类型名称:
非常感谢!让我看看我的翻译是否很好,因为到目前为止我还不能让它工作。我用我目前的情况更新了我的问题,我不确定你答案的第二部分。我相信你会比我更快地发现错误!!:)哦我想我成功了!当我为隐藏字段指定与当前字段相同的值时,我刚刚添加了.data
!是的,我忘记了<代码>。数据< /代码>:也许,如果这个问题对别人有帮助,请考虑在最后一行中使用与占星符名不同的占位符名称,因为它与隐藏字段的名称非常相似。再次感谢您的这种聪明的方法!我永远不会想到这个!
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