2 декабря 2008 г.

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

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


Первая ласточка: есть поле manytomany с аргументом through
  1. class Person(models.Model):  
  2.    name = models.CharField(max_length=128)  
  3.   
  4. class Group(models.Model):  
  5.    name = models.CharField(max_length=128)  
  6.    members = models.ManyToManyField(Person, through='Membership')  
  7.   
  8. class Membership(models.Model):  
  9.    person = models.ForeignKey(Person)  
  10.    group = models.ForeignKey(Group)  
  11.    date_joined = models.DateField()  

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

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

Вот простое решение как подружить два формсета, плюс добавить в счетчик.
Добавляем во view:
  1. class MergeForm(object):  
  2.    def __init__(self, groupform, memebershipform,index):  
  3.    self.groupform=groupform  
  4.    self.memebershipform=memebershipform  
  5.    self.index=index  
  6.   
  7. output=[]  
  8. idx=0  
  9.   
  10. for group_form in groupformset.forms:  
  11.    memebership_form=memebershipformset.forms[idx]  
  12.    output.append(MergeForm(group_form, memebership_form, idx+1))  
  13.    idx+=1  

Передаем в render_to_response два формсета и наш объект output.
  1. {{ groupformset.management_form }}  
  2. {{ memebershipformset.management_form}}  
  3. {% for form in output%}  
  4.  <fieldset>  
  5.  <legend>Форма № {{ form.index }}</legend>  
  6.  <table>  
  7.   {{ form.groupform }}  
  8.   {{ form.memebershipform }}  
  9.  </table>  
  10. </fieldset>  
  11. {% endfor %}  

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

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

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

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

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

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