2 декабря 2008 г.

Два formset'а в одном виде, дополнительное отображение

Все задачи без детального продумывания и без идеального знания Питона (или Пайтона).
Это скорее заметки для себя, а не руководство.


Первая ласточка: есть поле manytomany с аргументом through

class Person(models.Model):
name = models.CharField(max_length=128)

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')

class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()

Надо сделать одновременную форму для редактирования Группы и Членства для персоны.
И Членство для Персоны может быть не одно.
Считая, что у нас есть инстанс персоны, создаем два формсета (можно использовать inline_formset для каждого, а можно не использовать, нет разницы, по-моему (лишь использование instance вместо queryset, чего можно добиться просто изменив запрос):

Как создаются формсеты рассказывать не буду. В документации все подробно расписано. Будем создавать формсет на основе модели.
Итого: у нас два одинаковых формсета (в одном Членство, в другом Группа для этого членства). Но нам надо редактировать каждую форму данных формсетов вместе.

Вот простое решение как подружить два формсета, плюс добавить в счетчик.
Добавляем во view:

class MergeForm(object):
def __init__(self, groupform, memebershipform,index):
self.groupform=groupform
self.memebershipform=memebershipform
self.index=index

output=[]
idx=0

for group_form in groupformset.forms:
memebership_form=memebershipformset.forms[idx]
output.append(MergeForm(group_form, memebership_form, idx+1))
idx+=1

Передаем в render_to_response два формсета и наш объект output.

Ну а управление дополнительными формами я планирую вести с помощью jquery

4 комментария:

  1. Блогспот скушал пробелы... Что-то не знаю как побороть, да и поздно уже, потом поправлю, ну а в принципе код простой - отформатировать просто.

    ОтветитьУдалить
  2. Помогите пожалуйста с формсетами, тут ваш пост, у меня почти тоже самое. http://softwaremaniacs.org/forum/django/22107/. Спасибо.

    ОтветитьУдалить
  3. Дайте код и что надо получить. Я пока не понял точно, что требуется..

    ОтветитьУдалить