【问题标题】:How to specify label_attr for a model in a Flask-Admin ModelView using MongoEngine?如何使用 MongoEngine 在 Flask-Admin ModelView 中为模型指定 label_attr?
【发布时间】: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


    【解决方案1】:

    哦,现在我知道该怎么做了,尽管从文档中看并不那么明显。 form_args 是一个字典,其中包含以表单模型为键的项目。我需要做的就是……

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

    这看起来确实是正确的工作量(考虑到 Flask-Admin 不是某种 java 框架)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      相关资源
      最近更新 更多