Django从Model Form中的对象传递初始值

时间:2014-05-05 05:59:55

标签: python django django-forms django-class-based-views

我为模型MyModelFormA设置了django模型ModelA(我在FormView中使用了这些)。

我想使用ModelA的现有对象将初始值传递给表单,并在发生更改时创建它的新对象。

我一直在传递如下的初始值:

def get_form_kwargs(self):
    kwargs = super(MyFormView, self).get_form_kwargs()
    kwargs.update({'instance': ModelAObject})

我不确定为什么,但是当表单验证时如下

def form_valid(self, form):
    instance = form.save()

它只是更新现有的instance对象,而不是创建新的。

  1. HTTP请求是无状态的,请求如何知道在先前请求中处理的instance

  2. 如何解决这个问题?

  3. 我想做像

    这样的事情
    def get_initial(self):
        initial = model_to_dict(MyModelAObject)
        return initial
    

    实际上MyModelA中只有MyModelFormA个字段的子集。最初将所有字段作为字典传递,不会造成任何麻烦吗?

    是否有任何优雅的方式来处理它?<​​/ p>

2 个答案:

答案 0 :(得分:1)

  1. 当您传递 ModelForm一个实例时,它会将该实例的id字段设置为表单的首字母。因此,如果它在POST中收到一个ID,它会将其视为现有对象并进行更新

  2. 您需要传递单个字段的初始值(即id除外)。 最佳方式是仅将ModelForm中的字段作为初始值传递。

  3. def get_initial(self):
      return {
          'a': MyModelAObject.a,
          ....
      }
    

答案 1 :(得分:0)

可能你可以试试这个:

def form_valid(self, form):
    if form.has_changed()
        instance = form.save(commit=False)
        instance.pk = None
        #if you have id 
        instance.id = None
        instance.save() #will give you new instance.

选中In Django 1.4, do Form.has_changed() and Form.changed_data, which are undocumented, work as expected?,了解form.has_changed()的工作原理。