Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask Admin更新MongoDB ReferenceField_Python_Mongodb_Flask Admin - Fatal编程技术网

Python 使用Flask Admin更新MongoDB ReferenceField

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

我正在尝试创建一个管理页面,从中可以编辑用户是使用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”不是此字段的有效选项


编辑/更新引用字段的正确方法是什么?

您的模型看起来不错。但问题在于您的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')
这将帮助您正确更新引用