在提交在事件模型中添加新记录之前,我已成功使用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()并在那里加载数据。请让我知道怎么做..
答案 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),
)