首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django =要迭代的位置:视图或模板

Django =要迭代的位置:视图或模板
EN

Stack Overflow用户
提问于 2020-05-12 19:20:35
回答 1查看 187关注 0票数 1

我想知道构建我需要的代码的最佳位置:模板或视图。

比方说,我有三个列表,在一些数据中:

代码语言:javascript
运行
复制
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}]

对于每个月/年,我需要检查是否有任何销售,付款或供应商。我需要在模板中显示类似的内容

代码语言:javascript
运行
复制
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中的一个循环构建另一个dict,但是无论如何,我需要创建另一个循环来在模板中显示所有这些表。因此,我想在views.py中取消必要的循环可能会花费太多的时间。

是否有可能在模板中直接创建一些代码,只使用一个if-else循环条件,或者在views.py中构建整个dict是一个很好的实践?

你认为如何?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-12 19:41:58

是否可以直接在模板中创建一些代码,只需要一个if-else循环条件,或者用views.py构建整个dict是一个很好的实践?

有可能,也许是,但不,这根本不是一个好的做法。模板是以令人愉快的形式呈现数据的。视图应该处理业务逻辑。虽然有一个“灰色区域”,通常从涉及函数调用、任意字典查找等内容开始,您最好在视图中这样做。事实上,Django的模板语言被故意限制,以阻止在视图中执行这些操作。

我们可以用以下内容列出一组字典和数据:

代码语言:javascript
运行
复制
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')

接下来,我们可以总结一下这一点,例如,通过几个月的循环:

代码语言:javascript
运行
复制
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将包含如下数据:

代码语言:javascript
运行
复制
[{'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}]

现在您可以在模板中呈现它,例如:

代码语言:javascript
运行
复制
<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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61760200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档