сохранить множество полей с помощью модели - PullRequest
1 голос
/ 05 февраля 2012

У меня есть модель со многими отношениями к другой модели.Они оба имеют связанные с ними формы, последний имеет набор форм.

 class Foo(models.Model):
   name = models.CharField(max_length=20)
   bars = models.ManyToManyField("Bar",blank=True,null=True)

 class Bar(models.Model):
   name = models.CharField(max_length=20)

 class FooForm(ModelForm):
   class Meta:
     model = Foo

 class BarForm(ModelForm):
   class Meta:
     model = Bar

 BarFormSet = modelformset_factory(Bar,form=BarForm,extra=2)

В моем представлении / шаблоне стандартный виджет ManyToManyField заменен набором форм.Таким образом, я должен вручную связать экземпляры Bar, указанные в этом наборе форм, с ManyToManyField от Foo.Я делаю это чистым методом Фу:

 def clean(self,*arg,**kwargs):
   cleaned_data = self.cleaned_data
   # barSubFormInstance is the BarSubForm that is displayed in my view
   if barFormSetInstance.is_valid(): 
     barInstances = barFormSetInstance.save()
     cleaned_data["bars"] = barInstances
   return cleaned_data

Это почти работает.Проблема в том, что он устанавливает Foo.bars на набор измененных форм в наборе форм.Таким образом, если я добавлю один бар к своему foo, затем перезагрузлю форму и добавлю второй бар, foo получит только этот второй бар.* Метод save () возвращает экземпляры, которые были сохранены в базе данных.Если данные данного экземпляра не изменились в связанных данных, экземпляр не будет сохранен в базе данных и не будет включен в возвращаемое значение ...

Так что я понимаю, почемумой код не работаетЯ просто не знаю, что с этим делать.Что я могу передать в cleaned_data ["bars"], который будет добавлять новые измененные формы, но не удалять существующие?

Большое спасибо за вашу помощь.

1 Ответ

0 голосов
/ 08 февраля 2012

Для чего бы то ни было, в вышеприведенном комментарии произошла ошибка. И некоторые другие детали, которые я пропустил.

Соответствующий код выглядит так:

def clean(self,*arg,**kwargs):
   cleaned_data = self.cleaned_data
   # barFormSetInstance is the BarFormSet that is displayed in my view
   # it's already been validated by the time this function is called
   barInstances = [form.save() for form in barFormSetInstance if form.cleaned_data]
   cleaned_data["bars"] = barInstances
   return cleaned_data

Я также должен был убедиться, что для «blank» и «null» было установлено значение True для ManyToManyField. (Я не уверен, почему я должен был сделать это вместо того, чтобы переопределять метод is_valid () этого поля, чтобы просто возвращать True).

...