django从前一个实例中获取价值?

时间:2012-01-03 14:44:15

标签: python django forms

为什么会发生这种情况?

(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)

1 个答案:

答案 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()复制一个值及其包含的所有值。