2017-07-27 4 views
1

Ich bin ein Autodidakt Amateur jemals versucht, Grundlagen von Python, Django und Programmierung im Allgemeinen zu verstehen. Ich versuche ein Problem zu verstehen, das ich hatte. SoKlasse Variablen vs Methoden in Django Class Based Views

Ich habe diese Klasse

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

und verwendet es die folgende Funktion:

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 

Irgendwie ist der Ansicht, etwas an der Vorlage zu senden, da es einige Daten tut machen. Die Daten werden jedoch nicht sofort aktualisiert (dies wird schließlich der Fall), was bedeutet, dass ich sie nach Änderungen an der Datenbank aktualisiere, aber alte Daten bleiben bestehen. Außerdem sehe ich nie meine print in der Konsole erscheinen.

Allerdings, wenn ich die Klassenvariablen in Funktionen umwandeln, es funktioniert ganz gut:

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 

Könnte mir jemand helfen, die Regel verstehe ich in meiner ursprünglichen Versuch breche?

+0

Ich bin nicht wirklich sicher, was Sie fragen, da Sie wissen, was das Problem ist und was die Lösung ist. Und Sie identifizieren Klassenvariablen korrekt, so dass Sie offensichtlich den Unterschied zwischen Klassen- und Instanzvariablen kennen. Was vermisst du? –

+0

Ich habe mich nur gefragt, warum ich eine Seite laden kann, der CBV kann Daten liefern, aber anscheinend könnten es alte Daten sein, die nicht mehr wahr sind. Bleibt die ursprüngliche Klassenvariable so lange bestehen, wie der Server ausgeführt wird, nachdem er beim ersten Laden der Seite definiert wurde? –

Antwort

1

Sie sollten primary_table und secondary_table nicht als Klassenvariablen festlegen, da sie beim Laden des Moduls einmal berechnet werden.

Wie Sie bereits herausgefunden haben, ist der richtige Ansatz, Methoden zu verwenden. Auf diese Weise wird die Methode ausgeführt, wenn die Ansicht ausgeführt wird, sodass Sie den aktuellen Wert erhalten.

+0

Das klärt auf, und ich verstehe jetzt den Unterschied. Vielen Dank! –

Verwandte Themen