2017-07-27 125 views
1

我是一名自学成才的业余人员,曾试图理解Python,Django和一般编程的基础知识。我期待了解我遇到的问题。基于Django类的视图中的类变量与方法

所以我有这个类

class ContractsView(InventoryView): 
    template_name = "contracts.html" 
    page = "Contracts" 
    primary_table, secondary_table = build_contracts_tables(**{"commodity": None}) 

,并使用以下功能:

def build_contracts_tables(**kwargs): 
    print('fire') 
    primary_table_query = Purchase.inventory.current_contracts_totals(**kwargs) 
    primary_table_fields = ("total_meats", "total_value", "meat_cost") 
    primary_table_html = build_table([primary_table_query,], *primary_table_fields) if primary_table_query else err_str 

    secondary_table_query = Purchase.inventory.current_contracts(**kwargs) 
    secondary_table_fields = ("invoice", "supplier", "variety", "meats", "value", "meat_cost", "ship_date") 
    secondary_table_html = build_table(secondary_table_query, *secondary_table_fields) if secondary_table_query else err_str 

    return primary_table_html, secondary_table_html 

不知何故,该视图送点东西给模板,因为它使一些数据。但是,数据并没有立即更新(它最终会这样做),这意味着我将在更改数据库后刷新它,但旧数据将会保留。另外,我从未看到我的print出现在控制台中。

然而,当我转换类变量为函数,它工作得很好:

class ContractsView(InventoryView): 
    template_name = "contracts.html" 
    page = "Contracts" 

    def primary_table(self): 
     x,y = build_contracts_tables(**{"commodity": None}) 
     return x 

    def secondary_table(self): 
     x, y = build_contracts_tables(**{"commodity": None}) 
     return y 

有人能帮助我了解我在我原来的企图打破规则?

+0

我不确定你在问什么,因为你知道问题是什么以及解决方案是什么。而且你可以正确识别类变量,所以你显然知道类和实例变量之间的区别。那么你错过了什么? –

+0

我只是想知道为什么我可以加载页面,CBV可以提供数据,但显然它可能是旧数据不再是真实的。只要服务器在首页加载时定义之后运行,原始类变量是否会一直存在? –

回答

1

您不应将primary_tablesecondary_table设置为类变量,因为它们将在模块加载时计算一次。

正如您已经制定出的那样,正确的方法是使用方法。这样,该方法在视图运行时运行,因此您可以获得最新的值。

+0

清除它,我现在明白了它的区别。谢谢! –