[英]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)
請幫忙?
謝謝!
這個問題是通過在表單中添加一個隱藏字段並為其分配與數據庫中當前相同的值來解決的。 然后在驗證器中有一些東西需要檢查。 完整答案在這里:
為了進行更改,您只能編輯描述並保持類型名稱不變並在新類型名稱已經存在時給您一個錯誤,您可以使用 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.