【问题标题】:Validating with wtforms - Checking for existing record in MongoDB collection使用 wtforms 验证 - 检查 MongoDB 集合中的现有记录
【发布时间】:2020-05-13 22:39:59
【问题描述】:

我正在尝试使用 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.")

但是:当我 EDITtypeName 时,我如何检查重复项? 检查我的函数第二行的神奇方法是什么?或者有什么办法?

这是我的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)

请帮忙?

谢谢!

【问题讨论】:

  • 对不起,我不明白你想做什么?当您编辑您的类型名称时,它是否应该像下拉菜单一样在您编辑时显示重复?正如我看到的,您已经找到了如何使用typeName 查找重复项。
  • 我在尝试创建现有 typeName 时收到验证错误,但在我编辑它时需要一种方法来检查重复项。我刚刚更新了我的问题,添加了编辑它的路线。
  • 基本上,前两个sn-ps中'create'和'edit'之间的关系,这就是我想为我的第三个sn-p和第四个(我没有但是!)。
  • 因此,您正在寻找数据库,以便在您发送表单之前已经告知用户存在,然后您会收到验证错误。
  • 是的,这对于用户名来说很好,因为flask-login 在current_user 中有那个用户名,所以我可以将current_user 与username.data 进行比较。现在我需要找到 typeName 的验证方法,它不是“登录”,因为它不是用户。

标签: python mongodb flask flask-wtforms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    为了在只能编辑描述和保持类型名称不变的情况下进行更改,如果新类型名称已经存在则给你一个错误,你可以使用函数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)
    

    【讨论】:

    • 让我试着弄清楚这一点。我的函数 vlidate_type_name 在我的 forms.py 文件中,并且是我的类 EditTypeForm(FlaskForm) 的一部分。让我快速更新我的问题以明确,我当然提前感谢您的帮助!
    • 你仍然可以在 if 语句中调用 mongo 查询,你可以检查类型是否已经有 form.type_name.data,如果它已经存在,这会给你验证错误。我更改了 if 语句以检查数据库中的 type_name。
    • 很抱歉,我恐怕无法完成这项工作。如果您认为有帮助,我可以根据我目前的情况更新我的问题。
    • 我刚刚更新到现在的情况。希望您能多一点耐心并帮助我:)
    • 顺便说一句,我宁愿没有 flash 错误,而是 wtforms.validators 的验证错误
    猜你喜欢
    • 1970-01-01
    • 2016-11-19
    • 2018-12-08
    • 2018-07-16
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多