Python 使用Flask Admin更新MongoDB ReferenceField
我正在尝试创建一个管理页面,从中可以编辑用户是使用MonogDB和Flask admin的成员的角色 models.py 类Roledb.文件,RoleMixin: name=db.StringFieldmax_length=80,unique=True description=db.StringFieldmax_length=255 def _unicode__self: 返回self.name 类Userdb.Document,UserMixin: email=db.StringFieldmax_length=255 密码=db.StringFieldmax_length=255 角色=db.listfieldb.ReferenceFieldRole 管理员 类UserViewModelView: 从wtforms.fields导入选择MultipleField 从bson导入ObjectId,DBRef form_overrides=dictroles=SelectMultipleField options=[g.id,g.name代表模型中的g.Role.objects] 打印选项 [ObjectId'54a72849426c702850d01921',u'社区', ObjectId'54A7284426C702850D01922',u'customer'] form_args=dictroles=dictchoices=options 当我在Flask Admin edit_表单视图和cilck save中选择用户角色时,会显示以下表单验证错误:“54a72849426c702850d01922”不是此字段的有效选项Python 使用Flask Admin更新MongoDB ReferenceField,python,mongodb,flask-admin,Python,Mongodb,Flask Admin,我正在尝试创建一个管理页面,从中可以编辑用户是使用MonogDB和Flask admin的成员的角色 models.py 类Roledb.文件,RoleMixin: name=db.StringFieldmax_length=80,unique=True description=db.StringFieldmax_length=255 def _unicode__self: 返回self.name 类Userdb.Document,UserMixin: email=db.StringField
编辑/更新引用字段的正确方法是什么?您的模型看起来不错。但问题在于您的ModelView。我正在使用MongoEngine,下面是我的实现
class Role(db.Document, RoleMixin):
name = db.StringField(max_length=80, unique=True)
description = db.StringField(max_length=255)
def __unicode__(self):
return self.name
class User(db.Document, UserMixin):
email = db.StringField(max_length=255)
password = db.StringField(max_length=500)
active = db.BooleanField(default=True)
confirmed_at = db.DateTimeField()
roles = db.ListField(db.ReferenceField(Role), default=[])
# Optional to override save method.
def save(self, *args, **kwargs):
self.password = encrypt_password(self.password) # You can encrypt your password before storing in db, as a good practice.
self.confirmed_at = datetime.now()
super(User, self).save(*args, **kwargs)
以下是我的模型视图:
class UserView(ModelView):
can_create = True
can_delete = True
can_edit = True
decorators = [login_required]
column_filters = ('email',)
def is_accessible(self):
return current_user.has_role("admin")
class RoleView(ModelView):
can_create = True
can_delete = True
can_edit = True
decorators = [login_required]
def is_accessible(self):
return current_user.has_role("admin")
您不必显式地获取所有角色对象,flask admin会为您这样做。在创建用户对象之前,您只需先创建角色
此外,您还可以使用flask的before_first_请求创建初始用户,如下所示:
@app.before_first_request
def before_first_request():
user_datastore.find_or_create_role(name='admin', description='Administrator')
encrypted_password = encrypt_password('password') # Put in your password here
if not user_datastore.get_user('user@example.com'):
user_datastore.create_user(email='user@example.com', password=encrypted_password)
user_datastore.add_role_to_user('user@example.com', 'admin')
这将帮助您正确更新引用