Class Django 中的变量与方法 Class 基于视图
Class Variables vs Methods in Django Class Based Views
我是一个自学成才的业余爱好者,一直在努力了解 Python、Django 和一般编程的基础知识。我想了解我遇到的问题。
所以我有这个class
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 变量转换为函数时,它工作正常:
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
有人可以帮助我理解我在最初尝试中违反的规则吗?
您不应将primary_table
和secondary_table
设置为class 变量,因为它们将在加载模块时计算一次。
正如你已经研究过的,正确的方法是使用方法。这样,该方法会在视图运行时运行,因此您可以获得最新的值。
我是一个自学成才的业余爱好者,一直在努力了解 Python、Django 和一般编程的基础知识。我想了解我遇到的问题。
所以我有这个class
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 变量转换为函数时,它工作正常:
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
有人可以帮助我理解我在最初尝试中违反的规则吗?
您不应将primary_table
和secondary_table
设置为class 变量,因为它们将在加载模块时计算一次。
正如你已经研究过的,正确的方法是使用方法。这样,该方法会在视图运行时运行,因此您可以获得最新的值。