0

我已经能够在提交之前成功使用 django 1.4 中的 FormPreview 进行预览,以便在 Event 模型中添加新记录。喜欢功能。

这是我如何做到的:

#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() 并在那里加载数据。请让我知道如何做到这一点..

4

1 回答 1

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),
                              )
于 2013-01-21T04:00:06.257 回答