Question

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))

    def __repr_(self):
        return '<Parent %r>' % (self.name)

admin.add_view(ModelView(Parent, db.session))


class Child(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))
    parent = db.Column(db.Integer, db.ForeignKey(Parent))

admin.add_view(ModelView(Child, db.session))

Hello -

The code above is an example of flask-admin page that I am trying to create. The goal is to have on Child's create page a text box for name and a drop down to select a parent.

With the above setup, there is only name field. The parent drop down box is missing.

Any ideas how to make it happen?

Was it helpful?

Solution

How about if you change the Child class to this:

class Child(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(120))
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id'))
    parent = db.relationship('Parent', backref=db.backref('children', lazy='dynamic'))

I don't know much about this, and I don't know if you need the back reference, but this setup works for me with Flask-Admin.

OTHER TIPS

You likely need to specify some additional options to flask-admin via a subclass:

class ChildView(ModelView):
    column_display_pk = True # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    column_list = ('id', 'name', 'parent')


admin.add_view(ChildView(Parent, db.session))

Here is an all-inclusive solution that requires no manual maintenance.

from sqlalchemy import inspect

class ChildView(ModelView):
    column_display_pk = True # optional, but I like to see the IDs in the list
    column_hide_backrefs = False
    column_list = [c_attr.key for c_attr in inspect(Child).mapper.column_attrs]


admin.add_view(ChildView(Child, db.session))

For what it is worth, none of the solutions listed here worked for me. I was facing the issue where foreign keys were not showing up in Flask-Admin.

This is what worked for them to show up:

class CustomModelViewName(ModelView):
    can_delete = True
    column_hide_backrefs = False
    column_list = ["column_name", "column_name", "etc", "etc", "etc"]
    column_searchable_list = ["column_name"]
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top