繁体   English   中英

Django以模型形式从对象传递初始值

[英]Django pass initial values from object in Model Form

我为模型ModelA有Django模型表单MyModelFormA (我在FormView使用它们)。

我想使用ModelA现有对象将初始值传递给表单,并在发生更改时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对象,而不是创建新的instance对象。

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

  2. 如何解决呢?

我想到做类似的事情

def get_initial(self):
    initial = model_to_dict(MyModelAObject)
    return initial

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

有什么优雅的处理方式吗?

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

  2. 您将需要传递各个字段的初始值(即ID除外)。 最好的方法是仅在ModelForm中传递初始所需字段

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

可能您可以尝试以下方法:

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.

检查在Django 1.4中,未记录的Form.has_changed()和Form.changed_data是否按预期工作? 看看form.has_changed()如何工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM