Search code examples
flask-admin

how to make a custom filter in flask admin


What am I doing wrong in this?? I am getting an exception thrown.

Exception: Invalid field : does not contains any columns.

I actually want to filter results from three different columns containing the cost of rooms.If any room satisfies a certain condition from the three rooms then it should appear on the list. That's why I want to make a custom filter.

Please help me. Thanks in advance.

    from flask.ext.admin.babel import lazy_gettext
    from flask.ext.admin.model import filters

    class MyBaseFilter(filters.BaseFilter):
        """
            Base SQLAlchemy filter.
        """
        def __init__(self, column, name, options=None, data_type=None):
            """
                Constructor.

                :param column:
                    Model field
                :param name:
                    Display name
                :param options:
                    Fixed set of options
                :param data_type:
                    Client data type
            """
            super(MyBaseFilter, self).__init__(name, options, data_type)

            self.column = column

    class Views():
        class HotelAdmin(ModelView):
            class FilterCost(MyBaseFilter):
                def apply(self, query, value):
                    return query.filter(self.column > value)

                def operation(self):
                    return lazy_gettext('Cost')


            column_labels = {'hotel_name':'Hotel Details'}
            column_list = ('hotel_name','website')
            column_searchable_list = ('city',)
            column_filters = (FilterCost(Table.Hotel.deluxe_room,'Cost'),'state')

Solution

  • I did the following and it worked:

    added: from flask.ext.admin.contrib.sqla import filters

    removed: from flask.ext.admin.model import filters AND class MyBaseFilter(filters.BaseFilter)

    and then I inherited "filters.BaseSQLAFilter" in my filter class.

    But still, How can I use "class MyBaseFilter(filters.BaseFilter)", It is still throwing an error