使用 wtforms 验证 - 检查 MongoDB 集合中的现有记录

Validating with wtforms - Checking for existing record in MongoDB collection

我正在尝试使用 Flask 和 Mongodb 开发应用程序。 我使用 WTForms 和 Flask-login,当我使用此方法注册时,我目前正在验证用户名是否重复:

def validate_username(self, username):
    user = mongo.db.users.find_one({"username": username.data})
    if user:
        raise ValidationError("The username already exists.")

我在编辑用户时添加了第二行,因为我使用的是 flask-login 并且我是 current_user:

def validate_username(self, username):
    if username.data != current_user.username:
        user = mongo.db.users.find_one({"username": username.data})
        if user:
            raise ValidationError("The username already exists.")

所有这一切都很好,但我还想验证另一个表单中的另一个字段,当然,flask-login 中不存在该字段。这在我创建 typeName:

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

但是:当我 EDIT typeName 时如何检查重复项? 在我的函数的第二行检查的神奇方法是什么?或者怎么走?

这是我的 edit_type 路线:

@app.route("/type/edit/<id>", methods=["POST", "GET"])
@login_required
def edit_type(id):
    form = EditTypeForm()
    type = mongo.db.types.find_one({"_id": ObjectId(id)})
    if current_user.is_admin:
        if form.validate_on_submit():
            new_value = {
                "$set": {
                    "type_name": form.type_name.data,
                    "description": form.description.data,
                }
            }
            mongo.db.types.update_one(type, new_value)
            flash("Type has been updated", "info")
            return redirect(url_for("type", id=type["_id"]))
        elif request.method == "GET":
            form.type_name.data = type["type_name"]
            form.description.data = type["description"]
    return render_template("edit_type.html", title="Edit Type", form=form)

请帮忙?

谢谢!

为了在您只能编辑描述并保留类型名称并在新类型名称已存在时给您一个错误的地方进行更改,您可以使用函数 validate_type_name.

def validate_type_name(self, type_name):
    typeName = mongo.db.types.find_one({"type_name": type_name.data})
    if typeName:
        return False
    else:
        return True

然后让你的 edit_type :

@app.route("/type/edit/<id>", methods=["POST", "GET"])
@login_required
def edit_type(id):
    form = EditTypeForm()
    type = mongo.db.types.find_one({"_id": ObjectId(id)})
    if current_user.is_admin:
        if form.validate_on_submit():
            new_value = {
                "$set": {
                    "type_name": form.type_name.data,
                    "description": form.description.data,
                }
            }
            if not mongo.db.types.find_one({"type_name": form.type_name.data}):
               mongo.db.types.update_one(type, new_value)
               flash("Type has been updated", "info")
               return redirect(url_for("type", id=type["_id"]))
            else:
               <Write validation error message here>
        elif request.method == "GET":
            form.type_name.data = type["type_name"]
            form.description.data = type["description"]
    return render_template("edit_type.html", title="Edit Type", form=form)

通过向表单添加隐藏字段并为其分配与数据库中当前字段相同的值,此问题已解决。然后在验证器中有一些东西要检查。 完整答案在这里: