# Flask Admin

***

**1. Basic Setup**

```python
from flask_admin import Admin
from flask_appbuilder import ModelView

admin = Admin(app)
admin.add_view(ModelView(User, db.session))
```

**2. Custom ModelView**

```python
class MyModelView(ModelView):
    column_list = ('name', 'email')
    form_columns = ('name', 'email')

admin.add_view(MyModelView(User, db.session))
```

**3. Submenu Groups**

```python
class UserAdmin(ModelView):
    pass

class GroupAdmin(ModelView):
    pass

admin.add_view(AdminIndexView(name='Home'))
admin.add_view(UserAdmin(User, db.session, name='Users', category='Users'))
admin.add_view(GroupAdmin(Group, db.session, name='Groups', category='Users'))
```

**4. BasePermissionView**

```python
class MyAdminView(BasePermissionView):
    def is_accessible(self):
        return current_user.is_admin

admin.add_view(MyAdminView(name='Admin View'))
```

**5. View Menu**

```python
admin.add_view(ModelView(User, db.session), name='Users', menu_icon_type='glyph', menu_icon_value='glyphicon-user')
```

**6. Inline Forms**

```python
class UserAdmin(ModelView):
    inline_models = [Address]

admin.add_view(UserAdmin(User, db.session))
```

**7. Filters**

```python
class MyModelView(ModelView):
    column_filters = ('name', 'email')

admin.add_view(MyModelView(User, db.session))
```

**8. Search**

```python
admin.add_view(ModelView(User, db.session, search_columns=['name', 'email']))
```

**9. CRUD Actions**

```python
admin.add_view(ModelView(User, db.session, actions=['edit', 'delete']))
```

**10. CRUD Permissions**

```python
class MyModelView(ModelView):
    def can_create(self):
        return current_user.is_admin

    def can_edit(self, obj):
        return current_user.is_admin

    def can_delete(self, obj):
        return current_user.is_admin

admin.add_view(MyModelView(User, db.session))
```

**11. CRUD Operations in Templates**

```python
{{ form.name.label }}: {{ form.name.data }}<br>
{{ form.email.label }}: {{ form.email.data }}<br>
```

**12. Create & Edit Forms**

```python
form = admin.get_form(User)
form.name.data = 'John'
form.email.data = 'john@example.com'
# ...

form.process()
if form.validate():
    user = User()
    form.populate_obj(user)
    db.session.add(user)
    db.session.commit()
```

**13. Bulk Actions**

```python
admin.add_view(ModelView(User, db.session, bulk_actions=[('Operation', 'operation_url')]))
```

**14. Export**

```python
admin.add_view(ModelView(User, db.session, export_types=['csv', 'json']))
```

**15. Import**

```python
admin.import_models()
```

**16. Custom Buttons**

```python
class MyModelView(ModelView):
    extra_javascript = ['js/extra.js']
    column_extra_css = {'name': 'width: 200px;'}

admin.add_view(MyModelView(User, db.session))
```

**17. Custom CSS**

```python
# app/static/admin/css/my_custom.css
.table-striped > tbody > tr:nth-child(even) > td,
.table-striped > tbody > tr:nth-child(even) > th {
    background-color: #f9f9f9 !important;
}
```

**18. Model Notifications**

```python
class MyModel(Model):
    @admin.notify
    def notify_ created(self, foo):
        admin.add_message('User created.')
```

**19. View Groups**

```python
admin.add_view(
    FirstGroup(name='First Group'),
    SecondGroup(name='Second Group'),
)
```

**20. Sub Views**

```python
class UserSubView(BaseView):
    pass

class UserMainView(ModelView):
    subview = UserSubView(name='Sub View')

admin.add_view(UserMainView(User, db.session))
```

**21. Record View**

```python
admin.add_view(ModelView(User, db.session, details_modal=True))
```

**22. Field Arguments**

```python
class MyModelView(ModelView):
    column_list = ('name', ('email', lambda x: x.email.lower()))

admin.add_view(MyModelView(User, db.session))
```

**23. File Fields**

```python
admin.add_view(ModelView(FileModel, db.session, form_extra_fields={'file': FileField()}))
```

**24. AJAX Requests**

```python
import flask_admin.actions as actions
class MyAdminView(ModelView):
    edit_modal = True
    can_create = False
    create_modal = True
    actions = [actions.AjaxModalAction()]

admin.add_view(MyAdminView(User, db.session))
```

**25. Tabbed Layout**

```python
admin.add_view(ModelView(User, db.session, category='Users', endpoint='users_admin'))
admin.add_view(ModelView(Group, db.session, category='Users', endpoint='groups_admin'))
```

**26. User Lookup Fields**

```python
class MyModelView(ModelView):
    form_choices = {
        'user': list(db.session.query(User.id, User.name).all())
    }

admin.add_view(MyModelView(User, db.session))
```

**27. Model Multiple Relations**

```python
class MyModel(Model):
    users = db.relationship('User', backref=db.backref('my_models'))
```

**28. Query Customization**

```python
admin.add_view(ModelView(User, db.session, endpoint='users', filters=[User.id > 1]))
```

**29. Template Overriding**

```python
admin.add_view(ModelView(User, db.session, page_size=10, endpoint='users'))
```

**30. View Permissions**

```python
admin.add_view(ModelView(User, db.session, endpoint='users', permissions=[('can_edit', 'can_edit_user')]))
```

**31. URL Customization**

```python
admin.add_view(ModelView(User, db.session, endpoint='user_admin'))
```

**32. Multiple Site Admins**

```python
class MyAdminIndexView(BaseIndexView):
    @admin.expose('/')
    def index():
        return super(MyAdminIndexView, self).index()

admin.add_view(MyAdminIndexView(name='Home', url='/'))
```

**33. Flask-Security Integration**

```python
from flask_security import current_user, login_required

@admin.profile
def profile_admin(self):
    return login_required(current_user.profile())

admin.add_view(profile_admin)
```

**34. SQLAlchemy Filters**

```python
admin.add_view(ModelView(User, db.session, filters=[User.id == 1]))
```

**35. Lazy Update**

```python
class MyModelView(ModelView):
    lazy_model_updates = True

admin.add_view(MyModelView(User, db.session))
```

**36. Direct CRUD Operations**

```python
user = User()
form.populate_obj(user)
db.session.add(user)
db.session.commit()
```
