ReferenceField и Wtforms

#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")
  

Хорошего дня