форма django получает значение из предыдущего экземпляра? - PullRequest
0 голосов
/ 03 января 2012

есть идеи, почему это происходит?

(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 (commit = False)

(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 () этого объекта (класс Featured):

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 Ответ

2 голосов
/ 03 января 2012

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

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

Это неверно. Экземпляр модели формы устанавливает 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'

Дело в том, что copy просто скопирует значение, а содержащиеся в нем ссылки будут сохранены. deepcopy () копирует значение и все содержащиеся в нем значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...