Это скорее заметки для себя, а не руководство.
Первая ласточка: есть поле 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.
- {{ groupformset.management_form }}
- {{ memebershipformset.management_form}}
- {% for form in output%}
- <fieldset>
- <legend>Форма № {{ form.index }}</legend>
- <table>
- {{ form.groupform }}
- {{ form.memebershipform }}
- </table>
- </fieldset>
- {% endfor %}
Ну а управление дополнительными формами я планирую вести с помощью jquery
Блогспот скушал пробелы... Что-то не знаю как побороть, да и поздно уже, потом поправлю, ну а в принципе код простой - отформатировать просто.
ОтветитьУдалитьПрикрутил виджет
ОтветитьУдалитьПомогите пожалуйста с формсетами, тут ваш пост, у меня почти тоже самое. http://softwaremaniacs.org/forum/django/22107/. Спасибо.
ОтветитьУдалитьДайте код и что надо получить. Я пока не понял точно, что требуется..
ОтветитьУдалить