2012-01-03 47 views
0

任何想法,为什么发生这种情况?django形式从以前的实例中获取价值?

(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 

如上面可以看出,V1 .POSITION ==无一form1.save之后(提交= FALSE)

(Pdb) v1.image_type=2 
(Pdb) v1.Article=article 
(Pdb) v1.section=33 
(Pdb) v1.save() 
(Pdb) v1.position 
55L 

这里我设置一些值,并将其保存 保存()函数改变V1 POSITI到55(这是预期)

(Pdb) v2=tmpForm.save(commit=False) 
(Pdb) v2.position 
55L 

但现在,经过我救了V1,V2(一个完全地新的实例)有一个位置设置好的添加到在V1(不预期)


设置相同的一个

的情况下,它可以帮助,这里的这个对象(类精选)的保存()函数:

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) 
+2

是什么让你觉得内存地址很重要?我想不出为什么会这样。你不显示重要的代码,这是'form1'的实际内容,以及它是如何实例化的。 – 2012-01-03 15:17:28

+0

我只是确保它是不是同一个对象 form1的= MainFeaturedForm(request.POST,PREFIX = “F1”) 类MainFeaturedForm(的ModelForm): 类元: 模型=精选 栏=(” text1','text2') – 2012-01-03 16:06:31

回答

2

使用copy.deepcopy(),而不是copy.copy(野生猜测:可能是” s共享数据字典实例...)。

,但现在,在我保存的V1,V2(一个完全地新的实例)具有 位置设置好的添加到在V1设置相同的一个(不预期)

这是不正确。模型实例在init中设置self.instance,然后才能对其起作用。如果将引用复制到form.instance,然后在表单外修改它,它当然会反映在form.instance上。

deepcopy的主场迎战副本:

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

+0

它与copy.deepcopy()一起工作jpic建议......但我仍不明白为什么这个问题首先发生。 当我做了form1.save(commit = False)之后,form1如何改变我对它创建的对象的操作? – 2012-01-03 16:05:43

+0

因为form1包含的引用保留。使用deepcopy时,引用会被引用为初始引用的副本。一个例子是值得1000字:) – jpic 2012-01-03 16:44:48

+0

我得到这部分,我只是不明白为什么form1本身应该改变...即使我没有使用copy()/ deepcopy(),对于我来说没有太多意义,当我保存MODEL对象时,FORM对象被改变了(表单被保存为commit = False,它只是生成一个对象,然后将被保存) – 2012-01-03 17:15:01