表单实例化机制

时间:2014-04-14 11:24:27

标签: django forms dictionary copy django-context

我有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

这里有麻烦,在视图中,在迭代之后,对于所有项目,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)

让我们举个例子。 filter函数返回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种不同的形式是一种形式,但我无法解释原因,因为正如我所说,两者都有不同的内存地址。为什么,在循环中,我的表单属性的显示是正确的但在循环之外,有些东西搞砸了并将最后一个字典解析为我的上下文字典的两个条目?

有人有线索来确定问题吗?

0 个答案:

没有答案