为什么会发生这种情况?
(Pdb) import copy
(Pdb) tmpForm=copy.copy(form1)
(Pdb) form1
<cms.forms.MainFeaturedForm object at 0x7f05a0493350>
(Pdb) tmpForm
<cms.forms.MainFeaturedForm object at 0x7f05a054e950>
将form1复制到tmpForm(并确保它们位于不同的内存地址)以确保不会发生此行为,因为form1正在更改
(Pdb) v1=form1.save(commit=False)
(Pdb) v1.position
如上所示,在form1.save(commit = False)之后,v1.position == None
(Pdb) v1.image_type=2
(Pdb) v1.Article=article
(Pdb) v1.section=33
(Pdb) v1.save()
(Pdb) v1.position
55L
这里我设置了一些值并保存了它 save()函数将v1位置更改为55(这是预期的)
(Pdb) v2=tmpForm.save(commit=False)
(Pdb) v2.position
55L
但现在,在我保存v1后,v2(一个完全新的实例)的位置设置为在v1上设置的相同位置(不是预期的)
如果它有帮助,这里是这个对象的save()函数(特色类):
def save(self):
if self.Article:
try:
featured = Featured.objects.get(Article=self.Article, section=self.section)
self.hiddenID = featured.hiddenID
if self.position == None:
if featured.position == None:
self.position = 55
else:
self.position = featured.position
super(Featured, self).save(force_insert=False, force_update=True)
except Featured.DoesNotExist:
self.hiddenID = None
super(Featured, self).save(force_insert=True, force_update=False)
else:
self.hiddenID = None
super(Featured, self).save(force_insert=True, force_update=False)
答案 0 :(得分:2)
使用 copy.deepcopy ()而不是copy.copy(疯狂猜测:可能它正在共享数据dict实例......)。
但现在,在我保存v1后,v2(一个完全新的实例)有一个 位置设置为在v1上设置的相同位置(不是预期的)
这是不正确的。一个modelform实例在 init 中设置self.instance,然后才对其起作用。如果您将引用复制到form.instance,然后在表单外修改它,它当然会反映在form.instance上。
深度复制与复制:
In [1]: import copy
In [2]: a={'foo':'bar'}
In [3]: b={'x': a}
In [4]: bb=copy.copy(b)
In [5]: b['x']['foo']
Out[5]: 'bar'
In [6]: b['x']['foo'] = 'test'
In [8]: bb['x']['foo']
Out[8]: 'test'
In [9]: bbb=copy.deepcopy(b)
In [10]: bbb['x']['foo'] = 'y'
In [11]: bb['x']['foo']
Out[11]: 'test'
In [12]: b['x']['foo']
Out[12]: 'test'
In [13]: bbb['x']['foo']
Out[13]: 'y'
问题是副本只会复制一个值,并保留它包含的引用。 deepcopy()复制一个值及其包含的所有值。