2013-10-22 57 views
1

我有一個模型,將在其整個生命週期中更新。我希望每次更新都會返回一個基於舊對象的新對象,而不是更新原始對象。這是爲了讓用戶以前的對象作爲參考,同時確保它們不會覆蓋它。我嘗試使用相同的表單,其中this question建議可能會完成我想要的,但它沒有(它會更新)。然後我試着重寫save方法來指向我的CreateView,如下面的代碼,但是它告訴我它需要一個CreateView實例作爲它的第一個參數。有沒有辦法獲得我想要的行爲?強制django UpdateView創建一個新的對象,而不是

class TriageUpdateView(PermissionRequiredMixin, UpdateView): 
    model = Triage 
    form_class = TriageForm 
    login_url = "/login/" 
    permission_required = "myapp.add_triage" 

    def form_valid(self, form): 
     obj = form.save(commit = False) 
     obj.completed_by = self.request.user.person 
     return TriageCreateView.form_valid(self, form) 

回答

3

我找到了一種方法,但我不確定這是最好的方法。 Django通過檢查主鍵值來決定是更新還是插入數據庫。我在驗證中將其設置爲None,這已經成功了。

class TriageUpdateView(PermissionRequiredMixin, UpdateView): 
    model = Triage 
    form_class = TriageForm 
    login_url = "/login/" 
    permission_required = "myapp.add_triage" 

    def form_valid(self, form): 
     obj = form.save(commit = False) 
     obj.pk = None 
     obj.completed_by = self.request.user.person 
     return super(TriageUpdateView, self).form_valid(form) 
1

您的解決方案(PK =無)肯定工程(並記錄爲在Django的文檔功能 - 因此它應該wirk在未來也一樣),但如果你想手動做到這一點,你可以請執行以下操作:

在您的form_valid(self, form)中,請撥打一個功能create_new_triage(form.instance, self.request.user.person),並執行您的工作。 form.incance保存由用戶輸入的模型的當前實例,並且您可以在Triage.objects.create()方法中使用它的值。

這給了你更多的控制權,但是如果你只要設置pk = None就可以做到你想要的,我會堅持這一點。

相關問題