我有一个Area模型,我有服务模型。区域是服务的外键。
我想要一个模板,显示在各自区域下分组的每个服务,即
Area 1
- service a
- service b
Area 2
- etc.
我已将所有服务的对象列表传递给service_list.html
。我有一个自定义标记get_areas
,它返回区域,我可以在其上创建区域分区,并且我可以从中将区域名称传递给服务过滤器。但由于我无法在{% for service in object_list %}
中过滤(可以吗?),如何过滤HTML中每个区域部分的服务列表?
非常感谢。
答案 0 :(得分:1)
如果您发布模型,我可以为您提供确切的代码,但一般来说,这样的事情应该有效:
# Pass in 'areas' variable from view with all required areas
{% for area in areas %}
{{ area.name }}
{% for service in area.service_set.all %} #Gets all the services associated with an area
{{ service.name }}
{% endfor %}
{% endofor %}
不确定你是否需要自定义标签,但也许我只是不理解那部分。
答案 1 :(得分:0)
看一下regroup模板标签。它的构建目的完全相同 https://docs.djangoproject.com/en/1.3/ref/templates/builtins/#regroup
我已经意识到的一件事是,一旦你明确了在模板中显示复杂的相互关联的数据,那么在将数据传递到模板之前将数据转换为适当的对象(通常是字典列表)是有意义的。
这样,您可以更轻松地测试信息,并且可以更轻松地显示信息。 (在基于Python的视图中,您将拥有许多功能强大的工具,而不是Django模板语言)。
答案 2 :(得分:0)
@Maz - 谢谢你。我现在正在学习,需要查看service_set
。
@arustgi - 完美无缺。为了帮助新手绊倒这个,我传入'queryset': Service.objects.all()
并使用:
{% regroup object_list by area as area_list %}
{% for area in area_list %}
<h2 class="separate">{{ area.grouper }}</h2>
{% for service in area.list %}
<div class="column">
<h3>{{ service.title }}</h3>
{{ service.body }}
</div>
{% endfor %}
{% endfor %}
简洁,描述性的代码。非常感谢,你们两个