В вашем save
вы должны иметь аргумент commit
. Если что-то переопределяет вашу форму или хочет изменить то, что она сохраняет, оно выполнит save(commit=False)
, изменит вывод, а затем сохранит само.
Кроме того, ваша ModelForm должна возвращать модель, которую она сохраняет. Обычно ModelForm save
будет выглядеть примерно так:
def save(self, commit=True):
m = super(CallResultTypeForm, self).save(commit=False)
# do custom stuff
if commit:
m.save()
return m
Читайте метод save
.
Наконец, большая часть этой ModelForm не будет работать только из-за вашего доступа к вещам. Вместо self.callResult
вам нужно использовать self.fields['callResult']
.
ОБНОВЛЕНИЕ : В ответ на ваш ответ:
В сторону: Почему бы просто не использовать ManyToManyField
s в модели, чтобы вам не пришлось это делать? Похоже, вы храните избыточные данные и делаете больше для себя (и я :P
).
from django.db.models import AutoField
def copy_model_instance(obj):
"""
Create a copy of a model instance.
M2M relationships are currently not handled, i.e. they are not copied. (Fortunately, you don't have any in this case)
See also Django #4027. From http://blog.elsdoerfer.name/2008/09/09/making-a-copy-of-a-model-instance/
"""
initial = dict([(f.name, getattr(obj, f.name)) for f in obj._meta.fields if not isinstance(f, AutoField) and not f in obj._meta.parents.values()])
return obj.__class__(**initial)
class CallResultTypeForm(ModelForm):
callResult = ModelMultipleChoiceField(queryset=CallResult.objects.all())
campaign = ModelMultipleChoiceField(queryset=Campaign.objects.all())
callType = ModelMultipleChoiceField(queryset=CallType.objects.all())
def save(self, commit=True, *args, **kwargs):
m = super(CallResultTypeForm, self).save(commit=False, *args, **kwargs)
results = []
for cr in self.callResult:
for c in self.campain:
for ct in self.callType:
m_new = copy_model_instance(m)
m_new.callResult = cr
m_new.campaign = c
m_new.calltype = ct
if commit:
m_new.save()
results.append(m_new)
return results
Это позволяет наследовать CallResultTypeForm
, на всякий случай, когда это необходимо.