2010-08-31 78 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