簡體   English   中英

使用 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時如何檢查重復項? 在我的 function 的第二行檢查的神奇方法是什么? 或者有什么辦法?

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

請幫忙?

謝謝!

這個問題是通過在表單中添加一個隱藏字段並為其分配與數據庫中當前相同的值來解決的。 然后在驗證器中有一些東西需要檢查。 完整答案在這里:

使用 WTForms 自定義驗證器編輯現有數據庫字段時檢查重復

為了進行更改,您只能編輯描述並保持類型名稱不變並在新類型名稱已經存在時給您一個錯誤,您可以使用 function 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM