0

我对 Django 表单实例化有疑问。总而言之,这是我的代码。在一个视图中,我必须生成一个与许多对象相关的上下文。

def my_view(request):
    myObjects = ObjectFromModels.objects.filter(some_attribute = '1234')
    for item in myObjects:
        form_related = AssociatedForm(item_pk = item.pk)
        my_context[item] = form_related

class AssociatedForm(forms.Form):
    # attributes

    def __init__(self,item_pk,*args,**kwargs)
        super(AssociatedForm,*args,**kwargs)
        if item_pk : 
            obj = ObjectFromModels.objects.get(pk=item_pk)
            self.someAttribute = obj.calling_function() # It returns a list

麻烦来了,在视图中,在迭代之后,对于所有的item,的值my_context[item.name]都会被迭代的最后一个元素的值覆盖

为了调试,我打印了结果:

def my_view(request):
        myObjects = ObjectFromModels.objects.filter(some_attribute = '1234')
        for item in myObjects:
            form_related = AssociatedForm(item_pk = item.pk)

            print(form_related.someAttribute)
            my_context[item.name] = form_related

        for key,val in my_context:

            print(key)
            print(val.someAttribute)

让我们举个例子。过滤器函数返回 3 个对象:[ObjectA,ObjectB,ObjectC]

并从这些对象调用calling_function()返回:

  • 对于项目 A:['aze','zer','ert']
  • 对于 B 项:['qsd','sdf','dfg']
  • 对于项目 C:['wxc','xcv','vbn']

从逻辑上讲,在所有迭代之后,我会在我的上下文中使用它。问题是,它返回:

{<ObjectA>:['wxc','xcv','vbn'],
 <ObjectB>:['wxc','xcv','vbn'],
 <ObjectC>:['wxc','xcv','vbn']}

我首先认为这是一个参考问题,但在我的上下文中,这两种形式都有不同的内存地址。我也尝试过deep_copy,但没有任何改变。

我怀疑我认为 3 种不同的形式是一种形式,但我无法解释原因,因为正如我所说,两者都有不同的内存地址。为什么,在循环中,我的表单属性的显示是正确的,但在循环之外,有些东西搞砸了并将最后一个 dict 解析为我的上下文 dict 的两个条目?

有人知道问题所在吗?

4

0 回答 0