Django 模板的摘要标签
有时我必须使用 Django 编写一些简单的总结报告。
首先,我尝试使用 Django ORM 聚合和交错结果,但它可能会变得有点混乱,而且我失去了所有 ORM 惰性 - 只是感觉不对。
最近,我编写了一个通用迭代器类,可以对数据集进行分组/汇总。在视图中,它的工作原理如下:
s_data = MyIterator(dataset, group_by='division', \
sum_fields=[ 'sales', 'travel_expenses'])
在模板中,它的工作原理如下:
{% for g, reg in s_data %}
{% if g.group_changed %}
<tr><!-- group summary inside the loop -->
<td colspan="5">{{ g.group }} Division</td>
<td>{{ g.group_summary.sales }}</td>
<td>{{ g.group_summary.travel_expenses }}</td>
</tr>
{% endif %}
<tr><!-- detail report lines -->
<td>{{ reg.field }}<td>
<td>{{ reg.other_field_and_so_on }}<td>
...
</tr>
{% endfor %}
<tr><!-- last group summary -->
<td colspan="5">{{ s_data.group }} Division</td>
<td>{{ s_data.group_summary.sales }}</td>
<td>{{ s_data.group_summary.travel_expenses }}</td>
</tr>
<tr>
<td colspan="5">Total</td>
<td>{{ s_data.summary.sales }}</td>
<td>{{ s_data.travel_expenses }}</td>
</tr>
我认为它比我以前的方法优雅得多,但必须重复最后一个组摘要的代码违反了 DRY 原则。
我看过“杰拉尔多报道”,但它不是“一见钟情”。
为什么没有组/摘要模板标签,我应该写一个吗?
From time to time I have to write some simple summarized reports using Django.
First I tried using Django ORM aggregates and interleaving results, but it can get a bit messy and I loose all the ORM laziness - just doesn't feels right.
Lately I wrote a generic iterator class that can group/summarize a dataset. In the view it works like:
s_data = MyIterator(dataset, group_by='division', \
sum_fields=[ 'sales', 'travel_expenses'])
In the template it works like:
{% for g, reg in s_data %}
{% if g.group_changed %}
<tr><!-- group summary inside the loop -->
<td colspan="5">{{ g.group }} Division</td>
<td>{{ g.group_summary.sales }}</td>
<td>{{ g.group_summary.travel_expenses }}</td>
</tr>
{% endif %}
<tr><!-- detail report lines -->
<td>{{ reg.field }}<td>
<td>{{ reg.other_field_and_so_on }}<td>
...
</tr>
{% endfor %}
<tr><!-- last group summary -->
<td colspan="5">{{ s_data.group }} Division</td>
<td>{{ s_data.group_summary.sales }}</td>
<td>{{ s_data.group_summary.travel_expenses }}</td>
</tr>
<tr>
<td colspan="5">Total</td>
<td>{{ s_data.summary.sales }}</td>
<td>{{ s_data.travel_expenses }}</td>
</tr>
I think it is a lot more elegant than my previous approach but having to repeat the code for the last group summary violates the DRY principle.
I had a look at "Geraldo reporting" but it was not "love at the first sight".
Why there is no group/summary template tag, should I write one?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我可能错过了一些就在我面前的东西,但是为什么你有循环之外的最后一组?
I'm probably missing something right in front of my face, but why do you have the last group outside the loop?
我发现,它可以用迭代器来完成,不需要模板标签。诀窍是延迟迭代一个周期。
I figured it out, it can be done with iterators, no need for a template tag. The trick is to delay iteration one cycle.