2013-01-20 54 views
0

我已經能夠成功使用django 1.4中的FormPreview預覽,然後提交以在事件模型中添加新記錄。喜歡功能。預填充FormPreview以編輯數據

這是我如何做到這一點:

#urls.py 
url(r'^addevent/', EventFormPreview(EventForm)), 

#views.py 
class EventFormPreview(FormPreview): 
    def done(self, request, cleaned_data): 
    pdb.set_trace() 
    new_event = Event(**cleaned_data) 
    new_event.user = request.user 
    new_event.save() 
    return render_to_response("event/thanks.html", 
           {'cleandata': cleaned_data,}, 
           context_instance=RequestContext(request), 
          ) 

現在,我想在我的觀點類似editevent()通過同一預覽過程中去,並最終提交。唯一的區別是表單將被預先填充我正在編輯的數據。我如何通過編寫最小的代碼並利用現有的預覽流程來實現這一點?以下是我認爲部分urls.py會像:

url(r'^(?i)editevent/(?P<id>\d+)/$', EditEventFormPreview(EventForm)), 

我懷疑我將不得不重新定義在EventFormPreview(在init())和加載數據存在。請讓我知道如何做到這一點..

回答

1

有一次,我很高興沒有人回答我的問題 - 迫使我瞭解oop。

所以這裏是我如何得到我想要的,我認爲這是一個很好的pythonic做法。

我重寫parse_params()以獲取記錄ID,然後重寫get_initial()以使用數據填充表單。然後在done()中,我彈出舊記錄,並用cleaned_data進行更新。

class EditEventFormPreview(FormPreview): 
def parse_params(self, *args, **kwargs): 
    self.state["recordid"] = kwargs["id"] 
    pass 

def get_initial(self, request): 
    ob = Event.objects.filter(pk=self.state["recordid"]).values()[0] 
    return ob 

def done(self, request, cleaned_data): 
    new_event = Event.objects.get(pk=self.state["recordid"]) 
    for (key, value) in cleaned_data.items(): 
     setattr(new_event, key, value) 
    new_event.user = request.user 
    new_event.save() 
    return render_to_response("event/thanks.html", 
           {'cleandata': cleaned_data,}, 
           context_instance=RequestContext(request), 
          )