2010-08-31 80 views
1

我想知道是否有一种简单的方法在Django中创建“重复”ModelForm - 即预填充现有模型实例的内容的表单(除了某些字段,例如那些这是唯一的),但保存时会创建一个新实例。Django“Duplicate”ModelForm

我正在考虑沿着向ModelForm提供实例的方式,以便像“编辑”表单那样预填充数据,然后在保存之前将实例设置为None,但这会给出一个“NoneType”对象在窗体上调用.save()时没有属性'pk'“错误。看起来在构造表单时提供一个实例的行为会在最后产生一些依赖。

我很难找到解决这个问题的方法,但我无法想象一个“重复”的表单太独特了,所以也许我错过了一些简单的东西?

任何帮助,将不胜感激。

回答

1

我认为你需要的是一种填写表单中字段的初始值的方法。完成此操作的最佳方法是从现有实例创建一个初始值字典(以字段名称为关键字)并将其提供给表单。

事情是这样的:

class AddressForm(forms.ModelForm): 
    class Meta: 
     model = Address 

# Inside view: 
address = Address.object.get(**conditions) 
initial = dict() 
for field in ('state', 'zipcode'): # Assuming these are the fields you want to pre-fill 
    initial[field] = getattr(address, field) 

form = AddressForm(initial = initial) 
1
class AddressForm(forms.ModelForm): 
    class Meta: 
     model = Address 

# Inside view: 
address = Address.object.get(pk=<your-id>) 
address.pk = None # that's the trick, after form save new object will be created 
form = AddressForm(instance=address) 
+0

这似乎并不改变PK性质似乎并没有改变(在我的情况“ID”)的实际主键字段的工作。因此,ModelForm仍然覆盖现有的对象,而不是创建一个新对象。 – oogles 2010-09-01 00:43:26