1

MonogDB と Flask-Admin を使用して、ユーザーがメンバーであるロールを編集できる管理ページを作成しようとしています。

models.py

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=255)
    roles = db.ListField(db.ReferenceField(Role))

admin.py

class UserView(ModelView):
    from wtforms.fields import SelectMultipleField
    from bson import ObjectId, DBRef
    form_overrides = dict(roles=SelectMultipleField)
    options = [(g.id, g.name) for g in models.Role.objects()]
    # print options
    # [(ObjectId('54a72849426c702850d01921'), u'community'),
    #  (ObjectId('54a72849426c702850d01922'), u'customer')]
    form_args = dict(roles=dict(choices=options))

Flask-Admin edit_form ビューでユーザー ロールを選択して cilck を保存すると、次のフォーム検証エラーが表示されます。

ReferenceField を編集/更新する正しい方法は何ですか?

4

1 に答える 1

0

あなたのモデルはきれいに見えます。しかし、あなた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")

すべての Roles オブジェクトを明示的に取得する必要はありませflask-adminん。ユーザー オブジェクトを作成する前に、まずロールを作成する必要があります。

before_first_requestまた、次のようにフラスコを使用して初期ユーザーを作成できます。

@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')

これは、参照を正しく更新するのに役立ちます。

于 2015-11-13T05:57:18.810 に答える