【发布时间】:2013-02-18 18:10:50
【问题描述】:
我正在尝试使用我的 Django FormWizard 编辑现有对象。我正在遵循this blog post 中描述的技术,但它不起作用。这是我的编辑视图:
@login_required
def edit_wizard(request, id):
thing = get_object_or_404(Thing, pk=id)
if thing.user != request.user:
raise HttpResponseForbidden()
else:
initial = {0: {'year': thing.year,
'make': thing.make,
'series': thing.series,
....etc.
},
1: {'condition': thing.condition,
....etc.
},
}
form = CreateWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial_dict=initial)
return form(context=RequestContext(request), request=request)
您能帮我弄清楚如何向向导提供初始数据,以便我可以允许用户编辑他们的对象吗?感谢您的想法!
编辑:(2/18/13)
得到一个:
TypeError at /edit/10/ __init__() takes exactly 1 argument (3 given)
@sneawo 下面的回答解决了这个问题,但仍然没有传递初始数据,而是由向导创建新对象。
编辑:(2/19/13)
class CreateWizard(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
def done(self, form_list, **kwargs):
instance = Thing()
for form in form_list:
for field, value in form.cleaned_data.iteritems():
setattr(instance, field, value)
instance.user = self.request.user
instance.save()
return render_to_response('wizard-done.html', {
'form_data': [form.cleaned_data for form in form_list],
})
【问题讨论】:
-
为什么在
else条件下使用thing = Thing(user=request.user)? -
哦,是的。我的错。但是,删除了该条件,现在有一个
TypeError: __init__() takes exactly 1 argument (3 given)。在上面添加了详细信息。感谢您的任何想法! -
您能否也显示
CreateWizard类的代码。 -
@sneawo:添加了
CreateWizard。感谢您的任何想法.. -
感谢@sneawo
TypeError现在已经消失(+1 谢谢),但是我仍然无法将初始数据获取到表单中,以便我可以编辑对象。相反,由于某种原因,当我使用上述edit_wizard视图时会创建一个新对象。社区的任何想法都非常感谢尝试克服这个 FormWizard 问题。谢谢!