Search code examples
flaskflask-admin

How to set the value of an extra field in the list view?


I added an extra field clan to the ModelView of the class Matriline and add it to the columns in list view, as shown below.

How can I set the value of the extra field clan in the list view?

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

Solution

  • According to the code in BaseModelView.index_view there is no "configuration" option for that. You will need to override the get_list method in your MatrilineAdmin-class.

    This would look something like:

    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
    

    You could also try to specify a relationship from Matriline to Clan and to define the clan property directly in the model class:

    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')