Это скорее заметки для себя, а не руководство.
Первая ласточка: есть поле 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
Блогспот скушал пробелы... Что-то не знаю как побороть, да и поздно уже, потом поправлю, ну а в принципе код простой - отформатировать просто.
ОтветитьУдалитьПрикрутил виджет
ОтветитьУдалитьПомогите пожалуйста с формсетами, тут ваш пост, у меня почти тоже самое. http://softwaremaniacs.org/forum/django/22107/. Спасибо.
ОтветитьУдалитьДайте код и что надо получить. Я пока не понял точно, что требуется..
ОтветитьУдалить