使用get_or_create Django

时间:2013-07-03 17:25:59

标签: django forms django-formwizard

这是this question的延续。

问题是由于thing = get_object_or_404(Thing, pk=id)

,代码不允许创建新对象
class CreateWizard(SessionWizardView):
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT))
    def done(self, form_list, **kwargs):
       id = form_list[0].cleaned_data['id']
       thing = get_object_or_404(Thing, pk=id)
       if thing.user != self.request.user:
           raise HttpResponseForbidden()
       else:
           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],})

如何在此功能中使用get_or_create?或者是否有另一种更好的方法在此功能中创建新对象?谢谢你的想法!

1 个答案:

答案 0 :(得分:0)

一种方法是:

class CreateWizard(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:
               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],})