pallets-eco / flask-admin

Simple and extensible administrative interface framework for Flask
BSD 3-Clause "New" or "Revised" License
5.69k stars 1.56k forks source link

Multiple sort as django admin #1770

Open bekab95 opened 5 years ago

bekab95 commented 5 years ago

Multiple sort from admin interface as it is in Django admin ?

ljluestc commented 1 month ago

from flask_admin.contrib.sqla import ModelView
from flask import request, url_for

class CustomModelView(ModelView):
    def get_sort_links(self, column_key, sort_order):
        if sort_order == 'asc':
            next_sort_order = 'desc'
        else:
            next_sort_order = 'asc'
        return {
            'asc': url_for('.index', sort=column_key, sort_order='asc'),
            'desc': url_for('.index', sort=column_key, sort_order='desc')
        }.get(sort_order, url_for('.index'))

    def scaffold_sortable_columns(self):
        columns = super(CustomModelView, self).scaffold_sortable_columns()
        sortable_columns = {}
        for column in columns:
            column_key = column[1]
            column_name = column[0]
            sort_links = self.get_sort_links(column_key, 'asc')
            sort_links += ' / '
            sort_links += self.get_sort_links(column_key, 'desc')
            sortable_columns[column_name] = (column_key, sort_links)
        return sortable_columns

    def get_list(self, page, sort_field, sort_desc, search, filters, execute=True):
        if sort_field:
            sort_field = self._sortable_columns.get(sort_field)[0]
        return super(CustomModelView, self).get_list(page, sort_field, sort_desc, search, filters, execute)

admin.add_view(CustomModelView(YourModel))