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