【问题标题】:How to set the value of an extra field in the list view?如何在列表视图中设置额外字段的值?
【发布时间】:2016-12-27 11:20:24
【问题描述】:

我在Matriline 类的ModelView 中添加了一个额外的字段clan,并将其添加到列表视图的列中,如下所示。

如何在列表视图中设置额外字段clan 的值?

views.py

class MatrilineAdmin(sqla.ModelView):

    form_extra_fields = {
        'clan': SelectField('Clan',
            coerce=int,
            choices=[ (c.id, c.name) for c in Clan.query.all()])
    }
    create_template = 'admin/create.html'
    edit_template = 'admin/edit.html'
    column_list = ('name', 'pod', 'clan')

models.py

class Matriline(db.Model):
    __tablename__ = 'matriline'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    calls = db.relationship('Call', backref='matriline', lazy='select')
    pod_id = db.Column(db.Integer, db.ForeignKey('pod.id'))

    def __unicode__(self):
        return self.name

    def __str__(self):
        return self.name


class Pod(db.Model):
    __tablename__ = 'pod'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    matrilines = db.relationship('Matriline', backref='pod', lazy='select')
    clan_id = db.Column(db.Integer, db.ForeignKey('clan.id'))

    def __unicode__(self):
        return self.name
    def __str__(self):
        return self.name


class Clan(db.Model):
    __tablename__ = 'clan'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.Unicode(64))
    pods = db.relationship('Pod', backref='clan', lazy='select')

    def __unicode__(self):
        return self.name

【问题讨论】:

    标签: flask flask-admin


    【解决方案1】:
    class ExampleDatabase(sqla.ModelView):
    
        def _list_name(self, context, model, name):
            return 'something you like'
    
        column_formatters = {
            'example': _list_name
        }
    
        def get_column_names(self, only_columns, excluded_columns):
            only_columns.append('example')
            return super().get_column_names(only_columns, excluded_columns)
    

    为我工作。

    【讨论】:

      【解决方案2】:

      根据BaseModelView.index_view 中的代码,没有“配置”选项。您需要覆盖 MatrilineAdmin-class 中的 get_list 方法。

      这看起来像:

      class MadrilineAdmin(sqla.ModelView):
          def get_list(self, *args, **kwargs):
              count, data = super().get_list(*args, **kwargs)
              for d in data:
                  d.clan = 'whatever you want'
              return count, data
      

      您也可以尝试将 relationship 从 Matriline 指定到 Clan 并直接在模型类中定义 clan 属性:

      class Matriline(db.Model):
          # …
          pod = db.relationship('Pod')
      
          @property
          def clan(self):
              if not self.pod:
                  return None
              return self.pod.clan
      
      class Pod(db.Model):
          # …
          clan = db.relationship('Clan')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 2016-03-13
        • 2021-08-04
        • 2011-08-20
        相关资源
        最近更新 更多