2011-01-28 4 views
1

Скажем, у меня есть Джанго модель, которая выглядит примерно так:Джанго инлайн FormSets со сложной моделью для вложенной формы

class Order(models.Model): 
number = models... 
date = models... 

class OrderLine(models.Model): 
# One or more lines per order 
order = models.ForeginKey(Order) 
common_line = models.OneToOneField(CommonLine) 

class CommonLine(models.Model): 
# common elements of what might be on a line item... 
taxes = model... 
amount = model... 

Я хочу, чтобы создать форму, которая использует inlineformset для редактирования одной или нескольких строк (как OrderLine и CommonLine) за заказ.

Я могу создать набор форм, который работает с Order и OrderLine, но как я могу получить встроенный набор форм, чтобы предоставить мне все подробные элементы из класса CommonLine при отображении набора форм. Кажется, что документация на встроенных формах требует, чтобы встроенная форма - несколько строк на заказе могла отображаться только на один класс ...

Я не вижу что-то в документации? Я уверен, что могу что-то переопределить, я просто не знаю, где.

Спасибо за любую помощь ...

+0

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

+0

Вы когда-нибудь находили ответ для этого? ссылка на http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ не работает в Django 1.2.5+ из-за билета django # 11418 –

ответ

1

были необходимы некоторые незначительные изменения, чтобы сделать код Натана на http://yergler.net/blog/2009/09/27/nested-formsets-with-django/ работы в Django 1.3. Строка ниже вызывает ошибку ManagementForm.

TenantFormset = inlineformset_factory(models.Building, models.Tenant, extra=1)

Usings modelformset_factory и ручного определения QuerySet, кажется, работает, но я не реализована возможность добавлять дополнительные услуги.

TenantFormset = modelformset_factory(models.Tenant, extra=0) 

form.nested = [ 
     TenantFormset(
         queryset = Tenant.objects.filter(building = pk_value), 
         prefix = 'value_%s' % pk_value 
         ) 
        ] 

Я также должен был вручную передавать данные суб-суб-форм в is_valid метода:

def is_valid(self): 
result = super(BaseProtocolEventFormSet, self).is_valid() 

for form in self.forms: 
    if hasattr(form, 'nested'): 
     for n in form.nested: 
      n.data = form.data 
      if form.is_bound: 
       n.is_bound = True 
      for nform in n: 
       nform.data = form.data 
       if form.is_bound: 
        nform.is_bound = True 
      # make sure each nested formset is valid as well 
      result = result and n.is_valid() 
return result 

EDIT:

Новые экземпляры могут быть созданы с помощью JQuery. См. this question:

0

Это звучит очень похоже на подходе говорил на помощи http://yergler.net/blog/2009/09/27/nested-formsets-with-django/, где Натан пишет о том, как он обслужен «моделях данных многоуровневых; пример такого рода модель будет моделировать City Blocks, где каждый блок имеет одно или несколько зданий, и у каждого здания есть один или несколько арендаторов ».

еще несколько объяснений можно так же найти здесь Django Forms Newbie Question

2

Я решил проблему с http://yergler.net/blog/2009/09/27/nested-formsets-with-django/. Просьба использовать следующую коррекцию в файле forms.py:

 instance=None 
      pk_value = hash(form.prefix) 

+  correct_data = None 
+  if (self.data): 
+   correct_data = self.data; 
     # store the formset in the .nested property 
     form.nested = [ 
-   TenantFormset(data=self.data, 
+   TenantFormset(data=correct_data, 
          instance = instance, 

Просто работаю над Django 1.4.1 очень хорошо.

Смежные вопросы