После изрядного количества экспериментов с хакерами я придумал следующее решение, во многом благодаря Игнасио Васкесу-Абрамсу:)
По виду:
forms = itertools.izip_longest((None,),base_formset.forms, likes_formset.forms)
В шаблоне:
{% for (garbage1, base_form, like_form, garbage2) in forms %}
Проницательный читатель может заметить, что число аргументов в списке распаковки на один больше, чем было дано методу izip_longest (). Вы также можете заметить, что в качестве первого аргумента существует фактически пустой список.
Я никогда не мог заставить шаблон отображать первый аргумент в списке, следовательно, фиктивный первый аргумент. Также я обнаружил, что элементы N-1 списка визуализируются в шаблоне. Я также наткнулся на тот факт, что шаблон не очень заботится о несоответствии размеров, поэтому, дополнив переднюю и заднюю части, я смог получить формы, которые я действительно хотел отобразить!
ПРИМЕЧАНИЕ. При обработке POST я просто создаю наборы форм, с которыми я работаю, поскольку все фантомные данные не отправляются обратно через POST.
Конечно, это не самое чистое решение, и оно, вероятно, чрезвычайно уязвимо для поломок при обновлении, но пока достаточно практично, чтобы работать на меня.