2017-07-27 120 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

清除它,我現在明白了它的區別。謝謝! –