【问题标题】:Generalizing the columns of a Flask Table泛化 Flask 表的列
【发布时间】:2021-02-07 10:29:09
【问题描述】:

我定义一个具体的Flask Table如下

class MyTable(Table):

    def __init__(self, table_id, rows):
        self.table_id = table_id
        super().__init__(rows)
    
    Code = Col('Code', column_html_attrs = {'class': 'apply-filter'})

现在,如果我尝试通过将Code 属性移动到__init__ 中来概括它,

def __init__(self, table_id, rows, key):
    self.table_id = table_id
    self.__dict__[key] = Col(key, column_html_attrs = {'class': 'apply-filter'})
    super().__init__(rows)

出了点问题,不再显示。

我也尝试过使用self.Code = ...(这不是我想要的,因为它不是通用的)但它也失败了。

概念问题

即使我找到了可行的答案,我仍然不完全满意。 为什么我的原始代码也不好?父类的构造函数看不到派生类初始化时(动态)创建的字段吗?

【问题讨论】:

    标签: python flask flask-table


    【解决方案1】:

    通过在 Flask Table 的 github 源代码中查找 __init__ 找到了 relevant example。 就我而言,我可以做到

    def __init__(self, table_id, rows, key):
        super().__init__(rows)
        self.table_id = table_id
        self.add_column(key, Col(key, column_html_attrs = {'class': 'apply-filter'}))
    

    这变成了,更一般地说:

    class MyTable(Table):
        def __init__(self, table_id, rows, keys):
            super().__init__(rows)
            self.table_id = table_id
            for k in keys:
                self.add_column(k, Col(k, column_html_attrs = {'class': 'apply-filter'}))
    

    概念性答案

    父类的构造函数看不到派生类初始化时(动态)创建的字段吗?

    不,因为父类有一个元类,它想从__new__ 读取属性,并且元类在导入时执行,而这些动态字段不存在。

    Tl;博士

    为此,您可以通过导入table 将元类恢复为table.TableMeta

    from flask_table import Table, Col, table
    

    那你就可以了

    class MyTable(Table):
        def __init__(self, table_id, rows, keys, filters):
            dict = {}
            for k in keys:
                if k in filters:
                    dict[k] = Col(k, column_html_attrs = {'class': 'apply-filter'})
                else: 
                    dict[k] = Col(k)
            metadict = table.TableMeta.__new__(table.TableMeta, 'MyTable', (Table,), dict).__dict__
            self.__dict__.update(metadict)
            super().__init__(rows)
            self.table_id = table_id
    

    执行摘要

    上述方法可行,但这只是概念性的答案,以便深入了解正在发生的事情。

    在实际场景中,您只需仔细阅读 github repo 的完整 README。有一段Dynamically Creating Tables,按照说明就行了,有一个方便的create_table后面可以跟add_column,你终于发现了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2013-11-15
      • 2020-10-08
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多