如何使用MongoEngine为Flask-Admin ModelView中的模型指定label_attr?

时间:2015-03-15 03:45:12

标签: python mongoengine flask-admin

我认为我有一个非常常见的用例,我很惊讶它给了我多少麻烦。

我想在由以下两个类生成的Flask-Admin编辑表单中为ReferenceField使用键值对:

class Communique(db.Document):
    users = db.ListField(db.ReferenceField(User), default=[])

class User(db.Document):
    email = db.StringField(max_length=255, required=True)

    def __unicode__(self):
        return '%s' % self.id

我希望selectI是从ObjectId和我模型中的电子邮件字段构建的。

通过映射__unicode__ 属性到id字段我在mongoengine方面得到的好处就像在查询中使用整个对象一样:

UserInformation.objects(user=current_user)

这会导致Flask-Admin表单在编辑表单中显示mongo ObjectId,这样会产生令人遗憾的效果:

enter image description here

文档说我必须将label_attr提供给Flask-Admin创建的ModelSelectMultipleField。我是通过覆盖模型视图上的get_form方法完成的:

def get_form(self):
     form = super(ModelView, self).get_form()
     form.users = ModelSelectMultipleField(model=User,  
         label_attr='email',                                          
         widget=form.users.__dict__['kwargs']['widget'])
     return form

我正在重用原始form.users使用的小部件(这可能是错误的)。它在编辑现有项目时工作正常,但在创建新项目时会抛出异常(可能是因为我正在重用小部件)。

所有这些似乎比仅仅为我的SelectField提供label_attr所需的工作更多。修复列表视图很简单,只需在column_formatters字典中添加一个条目即可。在创建ModelView类时,没有简单的方法来指定label_attr吗?

我知道我可以通过返回__unicode__属性中的email属性来解决这个问题,但我觉得我不应该这样做!我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

哦,现在我看到了怎么做,虽然从文档中看不出来。 form_args是一个字典,其中的项目键入表单模型。我需要做的就是......

form_args = dict(users=dict(label_attr='email'))

考虑到Flask-Admin不是某种类型的java框架,看起来似乎做了大量努力。