Как я могу отобразить несколько форм наборов моделей django в сгруппированных наборах полей? - PullRequest
1 голос
/ 10 июня 2010

У меня проблема с необходимостью предоставления нескольких форм с поддержкой моделей на одной странице. Я понимаю, как сделать это с отдельными формами, т. Е. Просто создать обе формы, назвать их как-то иначе, а затем использовать соответствующие имена в шаблоне.

Теперь, как именно вы расширяете это решение для работы с наборами моделей? Конечно, морщина заключается в том, что каждая «форма» должна отображаться вместе в соответствующем наборе полей.

Например, я хочу, чтобы мой шаблон производил что-то вроде этого:

Домашняя база Описание: Хотите мороженое? Домашняя база Описание: Хотите мороженое?

Я использую такой цикл для обработки результатов (после проверки формы)

base_models = base_formset.save(commit=False)
like_models = like_formset.save(commit=False)
for base_model, likes_model in map(None, base_models, likes_models):

, который работает так, как я ожидал (я использую карту, потому что число форм может быть разным). Проблема в том, что я не могу найти способ сделать то же самое с помощью движка шаблонов. Система действительно работает, если я расположу все базовые модели вместе, а затем все модели лайков после палаты, но она не отвечает требованиям макета.

РЕДАКТИРОВАТЬ: обновлена ​​постановка задачи, чтобы быть более понятным о том, что именно я обрабатываю (я обрабатываю модели не формы в цикле for)

Ответы [ 2 ]

2 голосов
/ 10 июня 2010

По виду:

forms = itertools.izip(base_forms, likes_forms)

По шаблону:

{% for (base_form,like_form) in forms %}
0 голосов
/ 11 июня 2010

После изрядного количества экспериментов с хакерами я придумал следующее решение, во многом благодаря Игнасио Васкесу-Абрамсу:)

По виду:

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.

Конечно, это не самое чистое решение, и оно, вероятно, чрезвычайно уязвимо для поломок при обновлении, но пока достаточно практично, чтобы работать на меня.

...