5

我一直在努力创建一个 django FormWizard。我认为我非常接近,但我不知道如何保存到数据库。

我尝试了这里建议的解决方案:

def done(self, form_list, **kwargs):
    instance = MyModel()
    for form in form_list:
        for field, value in form.cleaned_data.iteritems():
            setattr(instance, field, value)
    instance.save()

    return render_to_response('wizard-done.html', {
        'form_data': [form.cleaned_data for form in form_list],
    })

但是将其放在 done 方法中会导致No Exception Supplied错误。save另一方面,将此代码放在方法中不会保存信息。

我也尝试了这里建议的解决方案:

def done(self, form_list, **kwargs):
    for form in form_list:
        form.save()
    return render_to_response('wizard-done.html', {
        'form_data': [form.cleaned_data for form in form_list],
    })

但这会返回另一个错误:AttributeError at /wizard/ 'StepOneForm' object has no attribute 'save'. 你遇到过这个问题吗?向导提交后如何将信息保存到数据库中?谢谢

4

4 回答 4

1
def done(self, form_list, **kwargs):
    new = MyModel()
    for form in form_list:
        new = construct_instance(form, new, form._meta.fields, form._meta.exclude)
    new.save()
    return redirect('/')
于 2013-03-06T08:58:53.177 回答
0

您需要先获取一个实例:

def get_form_instance( self, step ):
    if self.instance is None:
        self.instance = MyModel()
    return self.instance

def done(self, form_list, **kwargs):
    self.instance.save()
    return HttpResponseRedirect(reverse('mymodel_finish'))
于 2013-12-15T09:12:26.667 回答
0

试试这个方法

def done(self,request,form_list):
    if request.method=='POST':
        form1 = F1articles(request.POST)    
        form2 = F2articles(request.POST)
        form_dict={}
        for x in form_list:
            form_dict=dict(form_dict.items()+x.cleaned_data.items())
        insert_db = Marticles(heading = form_dict['heading'],
        content = form_dict['content'],
        created_by = request.session['user_name'],  
        country = form_dict['country'],
        work = form_dict['work'])
        insert_db.save()
        return HttpResponse('data saved successfully')
于 2013-03-06T08:46:36.783 回答
0

即使使用文件字段,这项工作也很好

    ....
    template_name = "..."
    file_storage = FileSystemStorage(location=os.path.join(settings.MEDIA_ROOT,'tmp'))

    def done(self, form_list, **kwargs):
        form_data, form_files = process_data(form_list)        
        form = MyModelForm(data=form_data, files=form_files)
        if form.is_valid():
            obj.save()
            return redirect('some_success_page')

def process_data(form_list):
    """ the function processes and return the field data and field files as a tuple """
    fields = {}
    files = {}
    for form in form_list:
    ## loop over each form object in the form_list list object
        for  field, (clean_field, value) in zip(form, form.cleaned_data.items()):
            ## loop over each field in each form object
            if field.widget_type == 'clearablefile':
                ## if field type == "clearablefile" add to files dict and continue to next iteration
                files.update({clean_field:value})
                continue
            ## else add to the field dict  
            fields.update({clean_field:value})
    return fields, files

于 2021-10-22T08:33:28.953 回答