Если правильно понимаю, каждая строка отвечает одному `ProfileUser`, а каждый столбец одной `Section`. Причём не всем, а только тем `Section`, которые принадлежат текущему проекту. Каждая ячейка, следовательно, есть число всех объектов типа `ProfileUserSection`, отвечающих соответствующим `ProfileUser` и `Section`. Правильно я понимаю?
Адресация в шаблоне невозможна, это умышленное ограничение. Поэтому вам придётся передать в шаблон уже готовую матрицу ячеек. Ну например следующим образом - не ручаюсь за оптимальность, впрочем.
sections = list(Section.objects.filter(project=project, ...))
users = list(ProfileUser.objects.filter(...))
cells = [[user] + [
ProfileUserSection.objects.filter(user=user, section=section).count() for section in sections
] for user in users]
context = {
'sections': sections,
'rows': cells
}
Шаблон:
{% for row in rows %}
<tr>
{% for cell in row %}
<td>{{ cell }}</td>
{% endfor %}
</tr>