Это продолжение этого вопроса, в котором я научился использовать метод save
многошагового мастера форм, чтобы сохранять поля формы по-разному в разных формах. Благодаря помощи @Yuji Tomita я понял, как правильно сохранять формы. Однако на данный момент я не понимаю, как обновить экземпляр и сохранить изменения в объекте.
Я попытался следовать логике, которую узнал от @Yuji, но не смог должным образом обновить объект.
Вот где я:
class StepOneForm(forms.Form):
...
def save(self, thing):
for field, value in self.cleaned_data.items():
setattr(thing, field, value)
class StepTwoForm(forms.Form):
...
def save(self, thing):
for field, value in self.cleaned_data.items():
setattr(thing, field, value)
class StepThreeForm(forms.Form):
...
def save(self, thing):
thing.point = Point.objects.get_or_create(latitude=self.cleaned_data.get('latitude'), longitude=self.cleaned_data.get('longitude'))[0]
for field, value in self.cleaned_data.items():
setattr(thing, field, value)
Вот как я перезаписал метод done мастера для сохранения экземпляров:
class MyWizard(SessionWizardView):
file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
def done(self, form_list, **kwargs):
id = form_list[0].cleaned_data['id']
try:
thing = Thing.objects.get(pk=id)
instance = thing
except:
thing = None
instance = None
if thing and thing.user != self.request.user:
raise HttpResponseForbidden()
if not thing:
instance = Thing()
for form in form_list:
form.save(instance)
instance.user = self.request.user
instance.save()
return render_to_response('wizard-done.html', {
'form_data': [form.cleaned_data for form in form_list],})
Как мне изменить метод save
, чтобы правильно обновить экземпляр thing
? Спасибо за ваши идеи!
РЕДАКТИРОВАТЬ: добавление представления, которое редактирует объект:
def edit_wizard(request, id):
thing = get_object_or_404(Thing, pk=id)
if thing.user != request.user:
raise HttpResponseForbidden()
else:
initial = {'0': {'id': thing.id,
'year': thing.year,
'color': thing.color,
... #listing form fields individually to populate the initial_dict for the instance
},
'1': {image': thing.main_image,
...
},
'2': {description': thing.additional_description,
'latitude': thing.point.latitude, #thing has a foreign key to point that records lat and lon
'longitude': thing.point.longitude,
},
}
form = MyWizard.as_view([StepOneForm, StepTwoForm, StepThreeForm], initial_dict=initial)
return form(context=RequestContext(request), request=request)
instance.save()
в методе done моего мастера форм. Я включил эту информацию выше в редактирование. Спасибо за любые идеи, которые могут помочь мне разобраться в этой сложной проблеме! - person Nick B   schedule 08.10.2013