我的模型与Manytomanyfield:
class Action(models.Model):
title = models.CharField('title', max_length=160)
countries = models.ManyToManyField('Country', null=True, blank=True)
class Country(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=255, blank=True)
每个动作都有一个带有描述的页面的URL。每个国家都有一个带有国旗的图标。行动可能有2个或更多国家。因此输出应该是这样的:
- 国家1,县2
- 动作
- 动作
- 动作
- 国家3,国家4
- 动作
- 国家1
- 动作
- 动作
- 国家3
- 动作
我不知道如何解决问题。标签{%regroup%}无法正常工作,因为它仅在每个动作中按第一个国家组成。
我认为您需要编写自己的重组算法。如果它在所有应用程序中仅使用一次,则可以在视图中创建它:
regrouped = {}
actions = Action.objects.all()
# be careful this implementation creates large amount of sql queries.
# you need to optimize it or cache it!
for action in actions:
country_key = '_'.join([country.pk for country in action.countries.all()])
if not country_key in regrouped:
regrouped[country_key] = {'countries': action.countries.all(), 'actions': []}
regrouped[country_key]['actions'].append(action)
和模板中:
{% for key, item in regrouped.items %}
Countries: {% for country in item.countries %}{{ country }};{% endfor %}
Actions: {% for action in item.actions %}{{ action }};{% endfor %}
{% endfor %}