2012-01-03 2 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' и как он создается. –

+0

Я только убедившись, что он не был тот же объект form1 = MainFeaturedForm (request.POST, префикс = "f1") класс MainFeaturedForm (ModelForm): класс Meta: модель = Рекомендуемые поля = (» text1 ',' text2 ') –

ответ

2

Использование copy.deepcopy(), а не copy.copy (дикий предположение: вероятно, это s разделяет экземпляр data dict ...).

, но теперь, после того, как я спас v1, v2 (а укомплектовать новый экземпляр) имеет положение выставиться одному и тому же, который был установлен на v1 (не ожидается)

Это неправильно. Экземпляр modelform устанавливает self.instance в init, а затем работает только на этом. Если вы скопируете ссылку на 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), как изменяется форма1 на то, что я делаю с созданным им объектом? –

+0

Поскольку ссылки, содержащиеся в форме1, сохраняются. С помощью deepcopy ссылки заменяются ссылками на копии исходных ссылок. Пример стоит 1000 слов :) – jpic

+0

Я получил эту часть, я просто не понимаю, почему сама форма1 должна быть изменена ...даже если я не использовал copy()/deepcopy(), для меня не слишком много смысла, что объект FORM изменяется, когда я сохраняю объект MODEL (форма сохраняется с commit = False, который просто генерирует объект, который затем будет сохранен). –