Flask-Admin formatters examples

To customize how the model’s columns are displayed in the list of objects in Flask-Admin, it requires column formatters. Here are some examples.

Column type formatters

import json
from bson import json_util
from datetime import date
from flask_admin.model import typefmt
from markupsafe import Markup

def pre_format(view, value):
    return Markup('<div class="pre">{}</div>'.format(html.escape(value)))


def json_format(view, value):  
    # useful for mongoengine dict and list fields
    return pre_format(view, json.dumps(value, indent=2, default=json_util.default))


def date_format(view, value):
    return value.strftime('%d.%m.%Y %H:%M:%S')


MY_DEFAULT_FORMATTERS = dict(typefmt.BASE_FORMATTERS)
MY_DEFAULT_FORMATTERS.update({
    date: date_format,
    dict: json_format
})

class MyModelView(ModelView):
    column_type_formatters = MY_DEFAULT_FORMATTERS

Override admin/base.html and define your styles, for example:

    .pre {
        white-space: pre;
        overflow-y: auto;
    }
    .model-list .pre {
        max-width: 300px;
    }

Column formatters

def user_link_formatter(view, context, model, name):
    field = getattr(model, name)
    url = url_for('user.details_view', id=field.id)
    return Markup('<a href="{}">{}</a>'.format(url, field))

class SomeModelView(MyModelView):
	"""An admin view for a model with user reference."""
    column_formatters = {
        'user': user_link_formatter
    }

base64 image

def base64_image_formatter(view, context, model, name):
    field = getattr(model, name, '')
    if field:
        field = Markup('<img src="data:image/jpg;base64,{}" width="100"/>'.format(field))
    return field

timestamp

def timestamp_formatter(view, context, model, name):
    field = getattr(model, name, None)
    return (field and datetime.utcfromtimestamp(field)) or ''

json

def json_formatter(view, context, model, name):
    return json_format(view, getattr(model, name, None))

html

def html_formatter(view, context, model, name):
    return pre_format(view, getattr(model, name, ''))
comments powered by Disqus