【发布时间】:2015-05-17 09:33:09
【问题描述】:
我认为我有一个非常常见的用例,并且对它给我带来的麻烦感到惊讶。
我想在以下两个类生成的 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
我希望从我的模型中的 ObjectId 和电子邮件字段构建选择。
通过映射 __unicode__ 属性到 id 字段我在 mongoengine 方面得到了很好的东西,比如在查询中使用整个对象:
UserInformation.objects(user=current_user)
这有导致 Flask-Admin 表单在编辑表单中显示 mongo ObjectId 的不幸效果,如下所示:
文档说我必须将 label_attr 提供给 Flask-Admin 创建的 ModelSelectMultipleField。我通过覆盖我的 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 类时是否没有简单的方法来指定 label_attr ?
我知道我可以通过在 __unicode__ 属性中返回 email 属性来解决这个问题,但我觉得我不应该这样做!我错过了什么吗?
【问题讨论】:
标签: python mongoengine flask-admin