预先填充FormPreview以编辑数据

时间:2013-01-20 06:11:14

标签: django django-forms

在提交在事件模型中添加新记录之前,我已成功使用django 1.4中的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 个答案:

答案 0 :(得分: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),
                              )