Back to snippets

flask_appbuilder_contact_model_with_modelview_and_menu.py

python

A basic application that creates a Contact Model, a ModelView to manage

Agent Votes
1
0
100% positive
flask_appbuilder_contact_model_with_modelview_and_menu.py
1import os
2from flask import Flask
3from flask_appbuilder import AppBuilder, SQLA, ModelView
4from flask_appbuilder.models.sqla.interface import SQLAInterface
5from sqlalchemy import Column, Integer, String, ForeignKey, Date
6from sqlalchemy.orm import relationship
7
8# Initialize Flask app
9app = Flask(__name__)
10
11# Basic Configuration
12basedir = os.path.abspath(os.path.dirname(__file__))
13app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(basedir, "app.db")
14app.config["CSRF_ENABLED"] = True
15app.config["SECRET_KEY"] = "thisisasecretkey"
16
17# Initialize Database and AppBuilder
18db = SQLA(app)
19appbuilder = AppBuilder(app, db.session)
20
21# Define a Model
22class ContactGroup(db.Model):
23    id = Column(Integer, primary_key=True)
24    name = Column(String(50), unique=True, nullable=False)
25
26    def __repr__(self):
27        return self.name
28
29class Contact(db.Model):
30    id = Column(Integer, primary_key=True)
31    name = Column(String(150), unique=True, nullable=False)
32    address = Column(String(564))
33    birthday = Column(Date)
34    contact_group_id = Column(Integer, ForeignKey("contact_group.id"))
35    contact_group = relationship("ContactGroup")
36
37    def __repr__(self):
38        return self.name
39
40# Define Model Views
41class ContactModelView(ModelView):
42    datamodel = SQLAInterface(Contact)
43    label_columns = {"contact_group": "Group"}
44    list_columns = ["name", "contact_group", "address"]
45
46class GroupModelView(ModelView):
47    datamodel = SQLAInterface(ContactGroup)
48    related_views = [ContactModelView]
49
50# Register Views with Menu
51db.create_all()
52appbuilder.add_view(
53    GroupModelView, "List Groups", icon="fa-folder-open-o", category="Contacts"
54)
55appbuilder.add_view(
56    ContactModelView, "List Contacts", icon="fa-envelope", category="Contacts"
57)
58
59if __name__ == "__main__":
60    app.run(host="0.0.0.0", port=8080, debug=True)