Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用WTForms自定义验证程序编辑现有数据库字段时检查重复_Python_Mongodb_Flask_Flask Wtforms - Fatal编程技术网

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