#python #flask #mongoengine #flask-wtforms #flask-mongoengine
#python #колба #mongoengine #flask-wtforms #flask-mongoengine
Вопрос:
У меня проблема с подключением к mongoengine и wtforms.
Я пытался приписать разрешение User class
с Role class
помощью, но я не могу приписать Role class
внешний ключ User class
Это мой код :
# On class File
from mongoengine import Document, StringField, ReferenceField
class User(Document):
username = StringField(unique=True)
password = StringField()
role = RefrenceField(Role, default=Role.objects.get(num=3))
class Role(Document):
num = IntField()
name = StringField()
# On form File
from wtforms import Form, StringField, SelectField
class UserEditForm(Form):
username = StringField(u'Username', [validators.required()]
role = SelectField(u'Role', [validators.required()], choices=[(r.id, r.name) for r in Role.objects])
При сохранении я получаю это сообщение об ошибке :
ValidationError: ValidationError (User:53a14fb0cdc4674abf452f2d) (A ReferenceField only accepts DBRef or documents: ['role'])
Я попытался заменить с r.id
помощью r
и r._object_key()
, но безрезультатно
Спасибо,
Ответ №1:
Я нахожу ответ: SelectField
не возвращает элемент хорошего типа для ReferenceField
.
Итак, это мой новый код :
# form File
class UserEditForm(Form):
username = StringField(u'Username', [validators.required()])
role = SelectField(u'Role', [validators.required()], choices=[(r.num, r.name) for r in Role.objects], coerce=int)
# Controller class
class EditUser(MethodView):
def get_context(self, id):
usr = User.objects.get(id=id)
form = UserEditForm(request.form, usr)
return {"usr": usr, "form": form}
def post(self, id):
context = self.get_context(id)
form = context.get("form")
if form.validate():
usr = context.get("usr")
form.populate_obj(usr)
usr.role = Role.objects.get(num=form.role.data)
usr.save()
return redirect("/user_edit/" id)
return response("form error validation")
Хорошего дня