2013-01-20 106 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), 
          )