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

How to specify label_attr for a model in a Flask-Admin ModelView using MongoEngine?

我想我有一个很常见的用例,我很惊讶它给我带来了多少麻烦。

我想在由以下两个 classes 生成的 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

我希望 select 在我的模型中由 ObjectId 和电子邮件字段构成。

通过映射 __unicode__ 属性到 id 字段我在 mongo 引擎方面得到了很好的东西,比如在查询中使用整个对象:

UserInformation.objects(user=current_user)

这具有导致 Flask-Admin 表单在编辑表单中显示 mongo ObjectId 的不幸影响,如下所示:

文档说我必须向 Flask-Admin 创建的 ModelSelectMultipleField 提供 label_attr。我通过重写 ModelView 上的 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 class 时没有简单的方法来指定 label_attr 吗?

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

Oy,现在我明白了如何去做,尽管从文档中看并不是那么明显。 form_args 是一个字典,其中的项目键控到表单模型。我需要做的就是...

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

这似乎是正确的努力(考虑到 Flask-Admin 不是某种 java 框架)。