我想知道构建我需要的代码的最佳位置在哪里:模板或视图。
假设我有 3 个列表和一些字典:
sell = [{'date__month': 1, 'date__year': 2020, 'sells_by_month': 15}, {'date__month': 5, 'date__year': 2020, 'sells_by_month': 115}]
payments = [{'date__month': 5, 'date__year': 2020, 'payments_by_month': 18}]
provider = [{'date__month': 4, 'date__year': 2020, 'providers_by_month': 200}, {'date__month': 5, 'date__year': 2020, 'providers_by_month': 320}]
对于每个月/每年,我都需要检查是否有任何销售,付款或提供商。我需要在模板中显示类似的东西
Period Sells Payments Provider
01-2020 15 0 0
02-2020 0 0 0
03-2020 0 0 0
04-2020 0 0 200
05-2020 115 18 320
06-2020 0 0 0
我可以在 views.py 中构建另一个带有循环的字典,但无论如何我需要创建另一个循环以在模板中显示所有这些表。所以我想这可能会花费太多时间,在 views.py 中进行不必要的循环。
是否可以直接在模板中创建一个代码,只有一个 if-else 循环条件,或者用 views.py 构建整个字典是一个很好的实践?
你觉得怎么样?
是否可以直接在模板中创建一个代码,只有一个 if-else 循环条件,或者用 views.py 构建整个
dict
是一个很好的实践?
可能,也许是的,但不,这根本不是好的做法。模板是关于以令人愉悦的形式呈现数据。视图应处理业务逻辑。虽然存在">灰色地带",但通常从涉及函数调用、任意字典查找等的那一刻起,您最好在视图中执行此操作。事实上,Django 的模板语言被故意限制,以阻止在视图中做这些事情。
我们可以用以下数据制作字典列表:
def records_to_dict(records, key):
return {(r['date__year'], r['date__month']): r[key] for r in records}
dict_sell = records_to_dict(sell, 'sells_by_month')
dict_payments = records_to_dict(payments, 'payments_by_month')
dict_provider = records_to_dict(provider, 'providers_by_month')
接下来,我们可以总结一下,例如通过循环几个月:
half_year = [
{'year': y, 'month': m, 'sells': dict_sell.get((y, m), 0), 'payments': dict_payments.get((y, m), 0), 'providers': dict_provider.get((y, m), 0)}
for y in range(2020, 2021)
for m in range(1, 7)
]
现在half_year
将包含如下所示的数据:
[{'month': 1, 'payments': 0, 'providers': 0, 'sells': 15, 'year': 2020},
{'month': 2, 'payments': 0, 'providers': 0, 'sells': 0, 'year': 2020},
{'month': 3, 'payments': 0, 'providers': 0, 'sells': 0, 'year': 2020},
{'month': 4, 'payments': 0, 'providers': 200, 'sells': 0, 'year': 2020},
{'month': 5, 'payments': 18, 'providers': 320, 'sells': 115, 'year': 2020},
{'month': 6, 'payments': 0, 'providers': 0, 'sells': 0, 'year': 2020}]
现在,您可以在模板中呈现它,例如:
<table>
{% for item in half_year %}
<tr>
<td>{{ item.year }}-{{ item.month }}</td>
<td>{{ item.sells }}</td>
<td>{{ item.payments }}</td>
<td>{{ item.providers }}</td>
</tr>
{% endfor %}
</table>