覆盖Django ModelForm中的save方法

我无法覆盖ModelForm保存方法。这是我收到的错误:

Exception Type:     TypeError  

Exception Value: save() got an unexpected keyword argument 'commit'

我的意图是让表单为3个字段提交许多值,然后为这些字段的每个组合创建一个对象,并保存每个对象。朝正确的方向发展将是王牌。

class CallResultType(models.Model):

id = models.AutoField(db_column='icontact_result_code_type_id', primary_key=True)

callResult = models.ForeignKey('CallResult', db_column='icontact_result_code_id')

campaign = models.ForeignKey('Campaign', db_column='icampaign_id')

callType = models.ForeignKey('CallType', db_column='icall_type_id')

agent = models.BooleanField(db_column='bagent', default=True)

teamLeader = models.BooleanField(db_column='bTeamLeader', default=True)

active = models.BooleanField(db_column='bactive', default=True)

from django.forms import ModelForm, ModelMultipleChoiceField

from callresults.models import *

class CallResultTypeForm(ModelForm):

callResult = ModelMultipleChoiceField(queryset=CallResult.objects.all())

campaign = ModelMultipleChoiceField(queryset=Campaign.objects.all())

callType = ModelMultipleChoiceField(queryset=CallType.objects.all())

def save(self, force_insert=False, force_update=False):

for cr in self.callResult:

for c in self.campain:

for ct in self.callType:

m = CallResultType(self) # this line is probably wrong

m.callResult = cr

m.campaign = c

m.calltype = ct

m.save()

class Meta:

model = CallResultType

class CallResultTypeAdmin(admin.ModelAdmin):

form = CallResultTypeForm

回答:

在你里面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

最后,由于你访问事物的方式,许多ModelForm都无法使用。相反self.callResult,你需要使用self.fields['callResult']

更新:针对你的回答:

旁:为什么不在ManyToManyField Model中使用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,以防万一。

以上是 覆盖Django ModelForm中的save方法 的全部内容, 来源链接: utcz.com/qa/428372.html

回到顶部