我认为我有一个非常常见的用例,我很惊讶它给了我多少麻烦。
我想在由以下两个类生成的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,这样会产生令人遗憾的效果:
文档说我必须将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属性来解决这个问题,但我觉得我不应该这样做!我错过了什么吗?
答案 0 :(得分:1)
哦,现在我看到了怎么做,虽然从文档中看不出来。 form_args是一个字典,其中的项目键入表单模型。我需要做的就是......
form_args = dict(users=dict(label_attr='email'))
考虑到Flask-Admin不是某种类型的java框架,看起来似乎做了大量努力。